Como criar um campo calculado ( subtração ) no base?

Tenho um BD com basicamente 3 tabelas:

tab_software ( ID | NOME | QTD_LICENCAS_ADQUIRIDAS )

tab _pc ( ID | COD_MAQUINA )

tab_instalacao ( ID | NOME | COD MAQUINA

Resumindo galera:

Na tab_software ( tabela de software ) tenho os nome dos programas e a qtd de licenças adquiridas
Na tab_pc ( tabela de computadores ) tenhos os nomes das máquinas do setor
Na tab_instalacao ( tabela de instalação de softwares nas máquinas ) serve para gerenciar as qtd de licenças.

Aí vem minha dúvida:

Eu criei uma consulta ( modo estrutura ) chamada cons_licencas onde tenho:

campo 1: tab_pc.CD_MAQUINA ( lista as máquinas que estão instalados determinado software )
função: contar (count)

campo 2: tab_software.NOME ( software usado como critério, esse campo é preenchido por instrução basic vinda de combobox de formulário )

campo3 : QTD_LICENCAS_ADQUIRIDAS ( lista a qts de licença na compra do softwre )
função: máximo

se a consulta retornar por ex, 20 resultados terei dados em redundância como aparecer em várias linhas o memso nome de software , a mesma qtd de licença , só mudando as máquinas onde estão instalados, mas com as funções, ele resume em uma linha a qtd deocorrencias do nome do software ( contar ) e o máximo da qtd de licenças ( ex. 10 ) , usei a função máximo por naum conhecer outra, pois o objetivo é retornar o valor do campo, já que todos são iguais.

Aí o resultado é:

cons_licenca

tab_software.QTD_LICENCAS_ADQUIRIDAS | tab_instalacao.NOME |


MAX: 10 | COUNT: 7


Queria criar um campo calculado chamado RESTANTES, com a fórmula:

“tab_software.QTD_LICENCAS_ADQUIRIDAS” - “tab_instalacao.NOME” = RESTANTES, ficando assim

tab_software.QTD_LICENCAS_ADQUIRIDAS | tab_instalacao.NOME | RESTANTES


MAX: 10 | COUNT: 7 | 3


Mas não tenho a mínima ideia de como fazer, alguém pode me ajudar?

Olá,

Acredito que você vai precisar colocar o seguinte no campo RESTANTES, diretamente via código SQL:

MAX( "tab_software.QTD_LICENCAS_ADQUIRIDAS" ) - COUNT( "tab_instalacao.NOME" ) AS "RESTANTES"

Como você usou as funções Máximo e Contar nos campos anteriores, é preciso o campo RESTANTES seja caculado através do mesmo tipo de funções.

Atte,
Grafeno

Obrigado Grafeno pela dica, infelizmente não consegui fazer, deu erro aqui, pode ser que eu tenha feito besteira ou meu Libre tá com bug, mas consegui de outra forma que posto aqui e talvez sirva como um modo a mais de resolver o mesmo problema para os futuros leitores deste tópico…

Eu fiz por macro no Base, fiz tudo baseado no formulário e não SQL, inserir campo “grid” ( controle de tabela ) baseado na consulta que tinha criao previamente e usei caixas de texto do tipo “campo calculado” para fazer o cáculo pegando os valores através das propriedades desses objetos (.value )

E ainda modifiquei a macro para me mudar a cor da fonte da caixa de resultado para azul em caso de saldo positivo, preto para nulo e vermelho para saldo negativo…

segue a macro:

Sub atualiza_form_licenca_sw
'---DECLARA VARIÁVEIS---------------------------------------------

Dim Form1, oConsulta, oConsulta2, cmb_codsw, SubForm_1, SubForm_2, cons_subtab,cons_subtab2, oLicencas, oUtilizadas, oCampo_numerico_1, oCampo_numerico_2, oCampo_numerico_3, label_1, label_2 As Object, x, y, r, w, z as integer, sSQL as String

'---SETA VARIÁVEIS A OBJETOS DO FORMULÁRIO------------------------

Set Form1=Forms("frm_licenca_sw")
cmb_codsw=Form1.Controls("txtSoftware")
oCampo_numerico_1 = Form1.Controls("Campo numérico 1")
oCampo_numerico_2 = Form1.Controls("Campo numérico 2")
oCampo_numerico_3 = Form1.Controls("Campo numérico 3")
label_1 = Form1.Controls("Caixa de texto 1")
label_2 = Form1.Controls("Caixa de texto 2")

'---SETA VARIÁVEIS A OBJETOS DOS SUBFORMULÁRIOS NO FORM PRINCIPAL--

Set SubForm_1 = Form1.Controls("Subform")
Set cons_subtab = SubForm_1.form.Controls("Controle_de_tabela_1")
Set  oLicencas = cons_subtab.Controls("TextField3")
'----------------------------------------------------------
Set SubForm_2 = Form1.Controls("Subform2")
Set cons_subtab2 = SubForm_2.form.Controls("Controle_de_tabela_2")
Set oUtilizadas = cons_subtab2.Controls("TextField1")

'---SETA VARIÁVEIS A OBJETOS DO BANCO DE DADOS------------------------

oConsulta = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("cons_subtab_licenca_sw")
oConsulta2 = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("cons_contar_subtab_licenca_sw")

'---EXECUTA INSTRUÇÕES SQL NAS CONSULTAS------------------------

oConsulta.Command = "SELECT DISTINCT `tab_licenca`.`cod_hw`, `tab_licenca`.`software`, `tab_software`.`total_licencas_adquiridas`, `tab_software`.`licencas_restantes` FROM `c06`.`tab_licenca` AS `tab_licenca`, `c06`.`tab_software` AS `tab_software` WHERE `tab_licenca`.`software` = `tab_software`.`nome` AND `tab_licenca`.`software` = '" & cmb_codsw.Value & "' ORDER BY `tab_licenca`.`cod_hw` ASC, `tab_licenca`.`software` ASC"

oConsulta2.Command = "SELECT COUNT(`software`) FROM `cons_subtab_licenca_sw`"

'---INICIO--------------------------------------

Form1.Requery

if oLicencas.Value="Livre" then 'Trata Valor texto em campo numérico

	label_1.Visible=True
	label_2.Visible=True
	oCampo_numerico_1.Visible=False
	oCampo_numerico_3.Visible=False
		
		if IsEmpty (oUtilizadas.Value)  then  'Trata valores Nulos
				oCampo_numerico_2.Value = 0
				
			else								  
					x = oUtilizadas.Value
					z = CInt (x)
					oCampo_numerico_2.Value = z
		endif
	
	sSQL = "UPDATE `c06`.`tab_software` SET `licencas_restantes` = ('Livre') WHERE `nome` = ('" & cmb_codsw.Value & "');"
	RunSQL(sSQL)
		
elseif IsEmpty (oLicencas.Value)  then 'Trata valores Nulos
	
	label_1.Visible=False
	label_2.Visible=False
	oCampo_numerico_1.Visible=True
	oCampo_numerico_3.Visible=True
	y = 0
	oCampo_numerico_1.Value = y
	
	if IsEmpty (oUtilizadas.Value)  then  'Trata valores Nulos
			oCampo_numerico_2.Value = 0
		else		
				  
			x = oUtilizadas.Value
			z = CInt (x)
			oCampo_numerico_2.Value = z
	endif
	
	r = CInt(y) - CInt(z) 

	if r > 0 then                          'Altera cor da fonte da caixa de texto condicionalmente para alertar sobre valores

				oCampo_numerico_3.ForeColor = RGB(0, 0, 192) 'Azul
		elseif 	r = 0 then 
				oCampo_numerico_3.ForeColor = RGB(0, 0, 0)   'Preto
		else
				oCampo_numerico_3.ForeColor = RGB(255, 0, 0) 'Vermelho
	endif

		oCampo_numerico_3.Value = r				'Resultado final da qtd de licenças disponíveis exibida na caixa de texto.
		
sSQL = "UPDATE `c06`.`tab_software` SET `licencas_restantes` = ('" & oCampo_numerico_3.Value & "') WHERE `nome` = ('" & cmb_codsw.Value & "');"
RunSQL(sSQL)

else  'Converte variáveis para números afins de execução de cálculos 

	label_1.Visible=False
	label_2.Visible=False
	oCampo_numerico_1.Visible=True
	oCampo_numerico_3.Visible=True
	y = oLicencas.Value
	w = CInt (y)
	oCampo_numerico_1.Value = w
	
	if IsEmpty (oUtilizadas.Value)  then  'Trata valores Nulos
			oCampo_numerico_2.Value = 0			
		else		
				  
			x = oUtilizadas.Value
			z = CInt (x)
			oCampo_numerico_2.Value = z
	endif
	
	r = CInt(w) - CInt(z) 

	if r > 0 then                          'Altera cor da fonte da caixa de texto condicionalmente para alertar sobre valores

				oCampo_numerico_3.ForeColor = RGB(0, 0, 192) 'Azul
		elseif 	r = 0 then 
				oCampo_numerico_3.ForeColor = RGB(0, 0, 0)   'Preto
		else
				oCampo_numerico_3.ForeColor = RGB(255, 0, 0) 'Vermelho
	endif
	
				oCampo_numerico_3.Value = r	'Resultado final da qtd de licenças disponíveis exibida na caixa de texto.
				
sSQL = "UPDATE `c06`.`tab_software` SET `licencas_restantes` = ('" & oCampo_numerico_3.Value & "') WHERE `nome` = ('" & cmb_codsw.Value & "');"
RunSQL(sSQL)

endif

		

		Form1.Requery


End Sub

@LuizCarlos18RJ, ainda bem que você achou uma solução e dividiu aqui com a gente. Muito bom!