Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
jescudeiro Aprendiz
Registrado: Segunda-Feira, 2 de Abril de 2012 Mensagens: 261 Localização: ribeirao preto
|
Enviada: Ter Ago 20, 2019 9:55 am Assunto: Pegar Resultado de Procedure SQL no Delphi |
|
|
Bom dia amigos,
Faço uma Procedure no SQLServer 2008 para incrementar o campo sequencia(Pk) da tabela vendas em definitivo. Pois, quando gero uma venda, busco o campo em uma tabela que só uso pra gerar sequencias temporárias.
A Procedure funciona certo, mas preciso saber no Delphi qual foi essa sequencia incrementada em definitivo para selecionar os dados no dbgrid.
Segue Procedure
ALTER PROCEDURE [dbo].[pIncrementaDefinitivo]
@CodVendaTemp int
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@CodVendaPainel Int
SET @CodVendaPainel = (Select MAX(SequenciaPedidos+1) from PainelC)
PRINT '@CodVendaPainel 1- ' + Convert(Varchar,@CodVendaPainel)
WHILE @CodVendaPainel = (Select CodVenda from Vendas where CodVenda = @CodVendaPainel)
BEGIN
SET @CodVendaPainel = @CodVendaPainel + 1
END
PRINT '@CodVendaPainel 2- ' + Convert(Varchar,@CodVendaPainel)
UPDATE PainelC set SequenciaPedidos = @CodVendaPainel
UPDATE Vendas set CodVenda = @CodVendaPainel where CodVenda =@CodVendaTemp
UPDATE VendasItens set CodVenda = @CodVendaPainel where CodVenda =@CodVendaTemp
UPDATE vendasMaquinasLocadas set CodVenda = @CodVendaPainel where CodVenda =@CodVendaTemp
UPDATE VendasMecanico set CodVenda = @CodVendaPainel where CodVenda =@CodVendaTemp
;
WITH CTE_RN as
(
SELECT
*,
ROW_NUMBER() OVER(PARTITION BY codvenda ORDER by QdadeDev) AS RN
FROM VendasItens where CodVenda = @CodVendaPainel
)
UPDATE CTE_RN
SET item = RN
/*
SELECT *FROM Vendas WHERE CodVenda = @CodVendaPainel
SELECT *FROM VendasItens WHERE CodVenda = @CodVendaPainel
SELECT *FROM VendasMecanico WHERE CodVenda = @CodVendaPainel
SELECT *FROM VendasMaquinasLocadas WHERE CodVenda = @CodVendaPainel
*/
SELECT @CodVendaPainel as Teste
END
Não consigo pegar esse último Select @CodVendaPainel as Teste
Muito obrigado |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Ago 20, 2019 11:53 am Assunto: |
|
|
Bom dia,
Acho que você pode adicionar um parâmetro de saída (output) na procedure para capturar o valor retornado na aplicação.
Poderia até mesmo transformar essa variável CodVendaPainel nesse parâmetro de saída.
Espero que ajude
Editado pela última vez por imex em Seg Dez 04, 2023 11:56 am, num total de 1 vez |
|
Voltar ao Topo |
|
|
jescudeiro Aprendiz
Registrado: Segunda-Feira, 2 de Abril de 2012 Mensagens: 261 Localização: ribeirao preto
|
Enviada: Ter Ago 20, 2019 12:00 pm Assunto: |
|
|
Obrigado , Imex
Você diz declarar @CodVendaTemp int output
E como pego depois?
Tenho que usar o componente AdoDsStoreProc?
Hoje para executar procedures, gero uma TAdoQuery em tempo de execuçao
Query.Add('Exec pIncrementaDefinitivo @CodVendaTemp =:c');
Consigo buscar por desse forma?
Muito Obrigado |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Ago 20, 2019 2:19 pm Assunto: |
|
|
Não, seria mais ou menos o seguinte:
Código: | ALTER PROCEDURE [dbo].[pIncrementaDefinitivo]
@CodVendaTemp int,
@CodVendaPainel Int output
AS
BEGIN
SET NOCOUNT ON;
-- DECLARE @CodVendaPainel Int |
Sobre o componente, acho que teria que usar a TADOStoredProc mesmo.
Espero que ajude |
|
Voltar ao Topo |
|
|
jescudeiro Aprendiz
Registrado: Segunda-Feira, 2 de Abril de 2012 Mensagens: 261 Localização: ribeirao preto
|
Enviada: Ter Ago 20, 2019 8:26 pm Assunto: |
|
|
Obrigado, mais uma vez pela ajuda.
Mas como consigo extrair esse valor para o Delphi.
Fiz conforme orientou.
ADOStoredProc1.Parameters.ParamByName('@CodVendaTemp').Value := DMX.CdsVendasN['CodVenda'];
ADOStoredProc1.Parameters.ParamByName('@CodVendaPainel').Value := DMX.CdsPainel['SequenciaPedidos'];
ADOStoredProc1.ExecProc;
Variavel := ADOStoredProc1.Parameters.ParamByName('@CodVendaPainel').Value;
nao consigo trazer o valor,
Obrigado |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Ago 21, 2019 10:45 am Assunto: |
|
|
Se não me engano o nome do parâmetro no ParamByName deve ser passado sem a @. Para confirmar experimente adicionar um TADOStoredProc no DataModule ou Form, configure as propriedades e depois abra a propriedade Parameters para ver como os nomes dos parâmetros são identificados.
E como o CodVendaPainel é um parâmetro de saída, a linha abaixo não deve ser utilizada:
Código: | ADOStoredProc1.Parameters.ParamByName('@CodVendaPainel').Value := DMX.CdsPainel['SequenciaPedidos']; |
Espero que ajude |
|
Voltar ao Topo |
|
|
|