Como Corrigir o erro de A subconsulta retornou mais de 1 valor. Isso não é permitido quando a subconsulta segue um =, !=, <, <= , >, >= ou quando ela é usada como uma expressão. A instrução foi finalizada.
Software: PDV - Softshop Caixa | Grupo: PDV
Solução
A subconsulta retornou mais de 1 valor. Isso não é permitido quando a subconsulta segue um =, !=, <, <= , >, >= ou quando ela é usada como uma expressão. A instrução foi finalizada.
Motivo Vendas: vendas de itens com composição

correção:
1.0 Abra o SQL management studio e vá até a pasta em procedimentos armazenados localize a opção dbo.USP_MovimentarEstoque como mostrado na imagem a baixo

1.2 após isso apague a opção e depois execute o script a seguir
/****** Object: StoredProcedure [dbo].[USP_MovimentarEstoque] Script Date: 24/02/2025 15:43:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[USP_MovimentarEstoque]
@TipoMovimentacao VARCHAR(50) = NULL,
@ProdutoId VARCHAR(50) = NULL,
@LojaOrigem VARCHAR(50) = 'MATRIZ',
@Quantidade FLOAT,
@Tam NVARCHAR(255)= NULL,
@Cores NVARCHAR(255)= NULL,
@BaixarComposicao BIT = 0
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ModuloApp NVARCHAR(255);
SET @ModuloApp = dbo.getModuloApp;
DECLARE @QuantidadeTotal FLOAT;
if @BaixarComposicao IS NULL
BEGIN
SET @BaixarComposicao = IIF((SELECT BaixarComposicao FROM Empresa) = 'SIM', 1, 0)
END;
--LOG
--INSERT INTO TabelaLog (Mensagem) VALUES ('---------------------------------------');
--INSERT INTO TabelaLog (Mensagem) VALUES ('[USP_MovimentarEstoque]');
-- INSERT INTO TabelaLog (Mensagem) VALUES (CONCAT('TipoMovimentacao: ', @TipoMovimentacao));
-- INSERT INTO TabelaLog (Mensagem) VALUES (CONCAT('ProdutoId: ', @ProdutoId));
-- INSERT INTO TabelaLog (Mensagem) VALUES (CONCAT('LojaOrigem: ', @LojaOrigem));
-- INSERT INTO TabelaLog (Mensagem) VALUES (CONCAT('Quantidade: ', @Quantidade));
--INSERT INTO TabelaLog (Mensagem) VALUES (CONCAT('BaixarComposicao: ', @BaixarComposicao));
-- INSERT INTO TabelaLog (Mensagem) VALUES ('---------------------------------------');
DECLARE @NaoControlarEstoque AS BIT
DECLARE @NaoBaixarComposicaoNaVenda AS BIT
SELECT @NaoControlarEstoque = NaoControlarEstoque, @NaoBaixarComposicaoNaVenda = NaoBaixarComposicaoNaVenda
FROM [Cadastro de Mercadorias] WHERE [Código da Mercadoria] = @ProdutoId
IF @NaoControlarEstoque = 0
BEGIN
if @TipoMovimentacao = 'SAIDA' -- SAIDA
BEGIN
UPDATE [Cadastro de mercadoriasLojas]
SET [Estoque] = [Estoque] - @Quantidade
WHERE [Código da Mercadoria] = @ProdutoId AND [Loja] = @LojaOrigem AND (
@ModuloApp = 'CONFECCAO' AND
[cadastro de mercadoriasLojas].[Tam] = @Tam AND
[cadastro de mercadoriasLojas].[Cores] = @Cores
OR
@ModuloApp <> 'CONFECCAO'
);
END
ELSE --ENTRADA
BEGIN
UPDATE [Cadastro de mercadoriasLojas]
SET [Estoque] = [Estoque] + @Quantidade
WHERE [Código da Mercadoria] = @ProdutoId AND [Loja] = @LojaOrigem AND (
@ModuloApp = 'CONFECCAO' AND
[cadastro de mercadoriasLojas].[Tam] = @Tam AND
[cadastro de mercadoriasLojas].[Cores] = @Cores
OR
@ModuloApp <> 'CONFECCAO'
);
END;
SELECT @QuantidadeTotal = SUM([Estoque])
FROM [Cadastro de mercadoriasLojas]
WHERE [Código da Mercadoria] = @ProdutoId;
UPDATE [Cadastro de mercadorias]
SET [Unidades em Estoque] = @QuantidadeTotal
WHERE [Código da Mercadoria] = @ProdutoId;
END
IF @BaixarComposicao = 1 AND @NaoBaixarComposicaoNaVenda = 0
BEGIN
DECLARE @temProducao int
SELECT @temProducao = COUNT(*)
FROM [Producao_Composicao]
WHERE [Código da Mercadoria] = @ProdutoId;
--IF COUNT ((SELECT [Código da Mercadoria] AS CodigoProduto, [Código da Composição] AS CodigoComposicao, [Quantidade]
-- FROM Producao_Composicao WHERE [Código da Mercadoria] = @ProdutoId)
IF (@temProducao > 0)
BEGIN
DECLARE @QuantidadeComposicao FLOAT
--SET @QuantidadeComposicao = (SELECT [Quantidade] FROM Producao_Composicao WHERE [Código da Mercadoria] = @ProdutoId)
UPDATE [cadastro de mercadoriasLojas]
SET Estoque = Estoque + (CASE WHEN @TipoMovimentacao='SAIDA' THEN -@Quantidade ELSE +@Quantidade END) * (SELECT Producao_Composicao.Quantidade)
FROM [cadastro de mercadoriasLojas]
INNER JOIN [Producao_Composicao] ON [cadastro de mercadoriasLojas].[Código da Mercadoria] = [Producao_Composicao].[Código da Composição]
WHERE Producao_Composicao.[Código da Mercadoria] = @ProdutoId AND [Loja] = @LojaOrigem;
UPDATE [cadastro de mercadorias]
SET [Unidades em Estoque] = [Unidades em Estoque] + (CASE WHEN @TipoMovimentacao='SAIDA' THEN -@Quantidade ELSE +@Quantidade END) * (SELECT Producao_Composicao.Quantidade)
FROM [cadastro de mercadorias]
INNER JOIN [Producao_Composicao] ON [cadastro de mercadorias].[Código da Mercadoria] = [Producao_Composicao].[Código da Composição]
WHERE Producao_Composicao.[Código da Mercadoria] = @ProdutoId;
END;
END;
END
GO
1.3 após executar efetue um teste com o mesmo produto que havia dado erro na tela de pedidos de venda do softshop se nao apresentar nem um erro é por que o erro foi corrigido e pedir para o cliente fazer uma nova venda no pdv