Totalizar campo de sub-consulta

(Helder) #1

Galera do SC
Boa noite!!!
Tenho um problema com uma consulta que estou tentando fazer.
Tenho uma consulta de mensalidades de clientes, funciona perfeitamente e uma outra consulta que me mostra os dados do cliente. Agora começam os problemas.
Na consulta de Clientes devedores, com quebra por cidade tenho uma sub-consulta que é a consulta de mensalidades com ligação, ate ai tudo bem. A minha duvida e de como fazer para totalizar um campo tipo “R$ Débito” que esta na consulta ‘mensalidades’ e fazer com que o resultado seja mostrado junto com a quebra (lembrando que o campo “R$ Débito não faz parte da consulta de ‘clientes’.
SELECT
devedores.dv_id,
devedores.dv_cliente,
devedores.dv_cl_datacad,
devedores.dv_cl_tipo,
devedores.dv_cl_contato,
devedores.dv_cl_fonef,
devedores.dv_cl_fonec,
devedores.dv_cl_plano,
devedores.dv_cl_valor,
devedores.dv_cl_cidade,
devedores.dv_cl_ip,
devedores.dv_cl_mac,
mesalidades.dv_id,
mesalidades.ms_valor,
mesalidades.ms_status
FROM
mesalidades INNER JOIN devedores ON mesalidades.dv_id = devedores.dv_id
WHERE
ms_status = ‘EM ABERTO’
Por favor se alguém puder me ajudar, desde já obrigado.

(system) #2

Olá Helder,

Você quer colocar a soma dos registros do campo “mesalidades.ms_valor” na linha da quebra, certo?
Não sei se entendi direito, mas se for isso mesmo dá pra fazer algo assim:

No evento onGroupBy (quebra), realizar a consulta no banco retornando a soma das mensalidades e colocar este valor na linha da quebra:

sc_lookup(ds,"SELECT SUM(mensalidades.ms_valor) FROM  mesalidades INNER JOIN devedores ON mesalidades.dv_id = devedores.dv_id WHERE ms_status = 'EM ABERTO' AND devedores.dv_cl_cidade = {devedores.dv_cl_cidade} GROUP BY devedores.dv_cl_cidade");
$total_quebra = {ds}[0][0];
sc_groupby_label ('devedores.dv_cl_cidade') = "Total: ".$total_quebra;

Acho que viajei “um pouco” na maionese nesse comando SELECT hehehe provavelmente vc terá que corrigi-lo pois este não irá retornar a soma corretamente, mas testei aqui e pelo menos a “idéia” deu certo… isso se eu entendi o que vc está querendo hehe

Espero que funcione…

Att.
Robson

(Helder) #3

Caro colega Robson…
Não consequi nada aqui!!! mas vou continuar tentando.
Muito obrigado pela atenção.
Att
Helder

(system) #4

Olá Helder,

Não apareceu nada?

Experimente colocar só isso no evento onGroupBy:

sc_groupby_label ('Nome_Do_Campo_Da_Quebra') = "Total";

o nome do campo fica entre aspas simples mesmo… é pra aparecer o texto “Total” na linha da quebra… se aparecer, o problema está no comando select.

Ah, eu tbm alterei algumas configurações de visualização da quebra, não me lembro quais agora… algo como “exibir título” ou “exibir label”…

Att.
Robson

(Helder) #5

Caro colega Robson
Desculpe pela demora em retornar. Eu refiz a minha consulta alterando algumas coisas, e utilizando o que você me passou, em parte esta funcionando até que bem, quase da forma que quero. Seque os dados:
Tabela 01 = mensalidades - comando SQL
SELECT
dv_id,
ms_dtvc,
ms_mes,
ms_valor,
ms_dtav,
ms_acesso,
ms_dtblq,
ms_status,
ms_dtpgto,
ms_tipodoc,
ms_indent
FROM
mensalidades
WHERE
dv_id = [v1] AND ms_status = ‘EM ABERTO’
Variavel : v1 = Saida

Tabela 02 = devedores – comando SQL
SELECT
dv_id,
dv_cliente,
dv_cl_datacad,
dv_cl_tipo,
dv_cl_contato,
dv_cl_fonef,
dv_cl_fonec,
dv_cl_plano,
dv_cl_valor,
dv_cl_cidade,
dv_cl_ip,
dv_cl_mac,
dv_eq_tpint
FROM
Devedores

Em evento – onInit = [v1] = ‘’;
Variavel: v1 = Entra

Quebra – no evento on GrupBy
sc_lookup(ds,“SELECT SUM(ms_valor)
FROM
mesalidades
INNER JOIN
devedores ON mesalidades.dv_id = devedores.dv_id
WHERE
ms_status = ‘EM ABERTO’ AND dv_cl_cidade = ‘{dv_cl_cidade}’
GROUP BY
dv_cl_cidade”);

$total_quebra = {ds}[0][0];
sc_groupby_label (‘dv_cl_cidade’) = "Total: ".$total_quebra;

Subconsulta – Ligada a: com_ms_ab_o2 – Parâmetros: v1 = {dv_id}
(com_ms_ab_o2 -> tabela mensalidades)
Até aqui, perfeito, só que guando dou baixa em alguma mensalidade de cliente que (alterando de EM ABERTO para PAGO) esse cliente passa a não dever mais nada, ok. Mas ele continua sendo listado na consulta e no detalhe da consulta (subconsulta) “Não há registros a exibir”
Há mais uma coisa como fazer para exibir o total geral.

Mais uma vez muito obrigado pela ajuda.
Att
Helder

(system) #6

Olá Helder!

Ao alterar o status da mensalidade para “PAGO”, está alterando também o campo devedores.dv_cl_valor, certo?

Acho que, mesmo alterando todas as mensalidades do cliente para PAGO, ele vai continuar sendo listado na consulta de devedores, pois ainda existe um registro na tabela devedores com os dados dele (apesar de estar com o dv_cl_valor = 0).

Uma opção (talvez não muito boa) é alterar o comando Sql pra listar apenas os devedores com dívida > 0:

    //Tabela 02 = devedores – comando SQL
     SELECT
         dv_id,....
     FROM
        Devedores
     WHERE
        dv_cl_valor > 0

Mas o ideal seria criar um evento lá no formulário onde vc altera o ms_status, para conferir se (após a alteração da mensalidade) o dv_cl_valor = 0. Se for igual a zero, teria que apagar o registro na tabela devedores. Isso se este registro não tiver mais utilidade é claro…

Para exibir o total geral, depende onde você quer mostrar ele… talvez o mais fácil seja ativar a totalização (soma) do campo “dv_cl_valor”, imagino que o cálculo fique correto.

Tentei criar uma totalização de um campo qualquer e alterar ele dinamicamente (pra calcular a soma do ms_valor), mas não consegui não hehe

Att.
Robson

(system) #7

Ah, Helder…

Dá pra colocar o total no rodapé também, tinha esquecido desse detalhe hehe testei aqui e ficou bem legal! É só criar um campo do tipo Moeda, esconder ele no evento onInit e fazer o cálculo pelo lookup no evento onFooter:

Campo: {label_total} - tipo: Moeda.

     // Evento onInit
     sc_field_display({label_total},off);
     // Evento onFooter
     sc_lookup(dstotal,"SELECT SUM(ms_valor) FROM mesalidades WHERE ms_status = 'EM ABERTO' GROUP BY dv_id");
     {label_total} = {dstotal}[0][0];
     $total_extenso = sc_vl_extenso({label_total}, 50, 'V');
     $total_extenso = ucfirst(strtolower($total_extenso)); // converte pra minúsculo deixando o 1º caractere em maiúsculo

Daí é só colocar os valores no rodapé da consulta, ex:
ROD_LIN1_COL1 -> Campo -> {label_total}
ROD_LIN1_COL2 -> Valor -> $total_extenso

Att.
Robson

(Helder) #8

Valeu Robson
Vou tentar em casa mais tarde… Hoje aqui no trampo ta duro!!! Kakakak
Mais tarde digo o resultado.

(Helder) #9

Caro colega Robson
Muito obrigado pela ajuda, ta tudo funcionando como eu queria, era isso mesmo…
Att
Helder