Pergunte aqui
0

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

perguntadas 2015-05-14 01:30:43 +0200

imagem do gravatar de LuizCarlos18RJ

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?

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

2 Respostas

1

respondidas 2015-05-15 15:45:40 +0200

imagem do gravatar de Grafeno

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

editar assinalar como ofensivo Excluir Link mais
1

respondidas 2015-05-30 13:55:48 +0200

imagem do gravatar de LuizCarlos18RJ

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 ...
(mais)
editar assinalar como ofensivo Excluir Link mais

Comentários

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

imagem do gravatar de GrafenoGrafeno ( 2015-05-30 18:10:25 +0200 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2015-05-14 01:30:43 +0200

Lidas: 947 vezes

Última atualização: May 30 '15