Mensagem Personalizada conforme condição

CRUD - Delphi

10/09/2025

Pessoal, estou montando uma mensagem personalizada para impedir a exclusão de fornecedor, caso existam contas PAGAS e A PAGAR em nome do mesmo.

Preciso personalizar o texto obedecendo alguns critérios.
Ao tentar excluir eu executo uma consulta que busca a quantidade de contas a pagar e pagas para este fornecedor e armazeno o resultado em 2 variaveis

var
Pagar, Pagas : Integer;
begin
Pagar := 2;
Pagas := 0;

          if (Pagar > 0) and (Pagas > 0 ) then
            Text := Format(''Existem %s contas a pagar e %s contas pagas'', [IntToStr(Pagar), IntToStr(Pagas)]);

          if (Pagar >= 1) and (Pagas = 0) then
            Text := Format(''Existem %s contas a pagar'', [IntToStr(Pagar)]);

          if (Pagar = 0) and (Pagas >= 1) then
            Text := Format(''Existem %s contas pagas'', [IntToStr(Pagas)]);
end;


Montei o código acima, para exibir a mensagem conforme cada situação, porém se houver 1 conta, gostaria que a mensagem ficasse no singular e não no plural...

exemplo:
Exite 1 conta a pagar e 5 contas pagas
Existem 5 contas a pagar e 1 conta paga
Existe 1 conta a pagar
Existem 10 contas a pagar
...


Alguém tem uma sugestão melhor, para otimizar esse código?
Renan

Renan

Curtidas 0

Melhor post

Arthur Heinrich

Arthur Heinrich

10/09/2025

var
  Pagar, Pagas : Integer;
  Texto1, Texto2 : String;
begin
  Pagar := 2;
  Pagas := 0;
 
  case Pagar of
    0: Texto1:='';
    1: Texto1:= 'Existe '+IntToStr(Pagar)+' conta a pagar';
    else
      Texto1:= 'Existem '+IntToStr(Pagar)+' contas a pagar';
    end;

  case Pagas of
    0: Texto2:='';
    1: Texto2:= IntToStr(Pagas)+' conta paga';
    else
      Texto2:= IntToStr(Pagas)+' contas pagas';
    end;

  Text:=Texto1;
  if (Text='') then
    if (Texto2<>'') then
      if (Pagas=1) then
        Text:='Existe '+Texto2
      else
        Text:='Existem '+Texto2
    else
  else
    if (Texto2<>'') then
      Text:=Text+' e '+Texto2;
end;

GOSTEI 1

Mais Respostas

Renan

Renan

10/09/2025

Olá, Arthur

Obrigado pela dica. Fiz algo semelhante

        case Pagar of
          1 : Mensagem := 'conta a pagar';
         else Mensagem := 'contas a pagar';
        end;

        case Pagas of
          1 : Mensagem1 := 'pagamento realizado';
         else Mensagem1 := 'pagamentos realizados';
        end;


        if (Pagar > 0) and (Pagas > 0 ) then
          Text := Format('Há %d '+Mensagem+' e %d '+Mensagem1, [Pagar, Pagas]);

        if (Pagar >= 1) and (Pagas = 0) then
          Text := Format('Há %d '+Mensagem, [Pagar]);

        if (Pagar = 0) and (Pagas >= 1) then
          Text := Format('Há %d '+Mensagem1, [Pagas]);
GOSTEI 0
Renan

Renan

10/09/2025

Só complementando, não uso o Case 0 pois antes desse código eu já tenho a verificação abaixo

if (Pagar > 0) or (Pagas > 0) then
GOSTEI 0
Renan

Renan

10/09/2025

Arthur,

Agora que estava revisando o código, me toquei de uma situação.
Esse projeto que estou atualizando possui uma SP que verifica se existem contas pagas e a pagar

BEGIN
  IF (TABELA = 'TBCEDENTES') THEN BEGIN
     TOTAL = 0;

     SELECT COUNT(*) FROM TBDUPLICATAS
     WHERE COD_CEDENTE = :CODIGO
     INTO QUANT;

     TOTAL = :TOTAL + :QUANT;

     SELECT COUNT(*) FROM TBVENCIDAS
     WHERE COD_CEDENTE = :CODIGO
     INTO QUANT;

     TOTAL = :TOTAL + :QUANT;

     IF (TOTAL > 0) THEN
        OK = 'N';
     ELSE
        OK = 'S';

     SUSPEND;
  END


Lá no delphi faço um selec pelo campo OK para informar ao usuario se o registro pode ou não ser deletado.
Você acha que seria possivel modificar essa SP para armazenar a quantidade de contas pagas e a pagar em 2 variaveis, para que depois eu possa exibir uma mensagem, conforme estavamos vendo antes?
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

10/09/2025

Não vejo o por quê de não ser possível.

Sua procedure já trabalha com uma série de parâmetros e variáveis, como a "TABELA", que aparenta ser um parâmetro de entrada. e "TOTAL" e "OK" que aparentam ser parâmetros de saída.

Você pode ter tantos parâmetros quanto deseje, na sua procedure. Porém, deve levar em conta que a interface da sua procedure (definição dos parâmetros de entrada e saída, bem como sua finalidade, é como um contrato. Alterar os parâmetros é como uma quebra de contrato, que pode afetar as rotinas que já se utilizam desta procedure.

A menos que você saiba exatamente o que está fazendo, talvez seja o caso de criar outra procedure para este propósito, de forma a manter a compatibilidade da procedure original e evitar problemas no código existente.
GOSTEI 0
Renan

Renan

10/09/2025

Os parametros de entrada são CODIGO, TABELA
de saida OK
as variaveis são TOTAL, QUANT

Uso essa procedure apenas em 3 telas de cadastro e eu faria a alteração para as 3, para poder usar a mensagem parametrizada que estamos vendo neste tópipo.
Então, se eu criar mais 2 parametros de saida para armazenar cada count e recompilar, devo obter o resultado desejado.

Não sei se expliquei direito...

Por outro lado eu poderia deixar de usar essa SP e fazer o select count direto no botão de exclusão
GOSTEI 0
POSTAR