SQL - Atualizar tabelas

28/10/2015

0

Boa tarde estou com uma duvida que me esta a destruir os miolos.
Eu estou a fazer esta tabela e nela preciso de inserir dados de outras tabelas. a questao é esta: a linha 10 apresenta dados de uma devolução. isso esta me a fazer com o valor do pcm fique negativo, o que nao pode acontecer.
[img]http://arquivo.devmedia.com.br/forum/imagem/461292-20151028-133947.png[/img]

Se alguem souber alguma forma de ajuda para me resolver isto, agradecia
Abraços a todos
Luis

Luis

Responder

Post mais votado

29/10/2015

Mais uma vez : Sempre que postar código no fórum, use a tag "Inserir Código" ( aí em cima... ).

Quanto a identação no código, uma consulta simples na WEB resolve seu problema :

http://softwarelivre.org/eduardobonfandini/blog/boas-praticas-de-programacao-1-%E2%80%93-indentacao-e-padroes-de-projeto

https://compilandotudo.wordpress.com/2009/09/10/a-importancia-da-identacao-do-codigo-na-programacao/

Quanto ao problema em si... se você, que tem algum conhecimento da necessidade, tem dificuldade em explicar, vai ficar complicado lhe ajudar... pois precisamos entender minimamente o que você precisa.

Faça o seguinte : decompanha o problema em problemas menores !

Qual a sequencia de passos que você precisa dar pra resolver isso aí ?

Depois de definida a sequencia, retorne ao post com sua primeira dúvida... quem sabe trabalhando isso por partes, tenhamos sucesso !

Marcos P

Marcos P
Responder

Mais Posts

28/10/2015

Marcos P

Não entendi sua dúvida... você precisar desprezar as devoluções na consulta, é isso ?

Se for, basta colocar isso no WHERE, algo como : WHERE Tipo <> 'Devoluções'

Senão for esse o problema, detalhe melhor sua necessidade e inclua no post a query que você está trabalhando.
Responder

28/10/2015

Luis

Não entendi sua dúvida... você precisar desprezar as devoluções na consulta, é isso ?

Se for, basta colocar isso no WHERE, algo como : WHERE Tipo <> 'Devoluções'

Senão for esse o problema, detalhe melhor sua necessidade e inclua no post a query que você está trabalhando.


Marcos P, antes de mais , muitissimo obrigado.
Entao é assim.
O desafio é fazer uma tabela e nela inserir dados nos campos "idLinha,Data,TipoDocumento, NDocumento,Modelo,Entrada,Saida,StockAcumulado,P_Custo,TotalDoc,ValorTotal,PCM,PVenda,Desconto,Margem,MargemPCT"
os primeiros campos ate ao campos Saida é so fazer select de outras tabelas, mas os campos seguintes envolvem calculos.
a query de inserçao:

/*inserir na table*/
INSERT INTO Tbl_PCM(
idLinha,
Data,
TipoDocumento,
NDocumento,
Modelo,
Entrada,
Saida,
StockAcumulado,
P_Custo,
TotalDoc,
ValorTotal,
PCM,
PVenda,
Desconto,
Margem,
MargemPCT
)

SELECT
PM.ID_Movimento,
PM.Data,
Td.Tipo_Documento,
PM.N_Documento,
P.Modelo,
PM.Entrada,
PM.Saida,
(SELECT SUM(Entrada-Saida) FROM Tbl_Produtos_Movimentos WHERE ID_Produto = P.ID_Produto AND Data <= PM.Data) AS Acumulado,
CASE TD.Tipo_Documento
WHEN 'Nota de Credito' THEN (SELECT TmpPM.P_Custo FROM Tbl_Produtos_Movimentos TmpPM WHERE TmpPM.ID_Tipo_de_Documento=1 AND TmpPM.N_Documento=NC.idTicket)
ELSE PM.P_Custo
END AS P_Custo,
CASE TD.Tipo_Documento
WHEN 'Nota de Credito' THEN (SELECT TmpPM.P_Custo FROM Tbl_Produtos_Movimentos TmpPM WHERE TmpPM.ID_Tipo_de_Documento=1 AND TmpPM.N_Documento=NC.idTicket)
ELSE PM.P_Custo
END * (PM.entrada - PM.saida) AS TotalDoc,
0 AS ValorTotal,
0 AS PCM,
ISNULL(ISNULL(TL.SAFT_UnitPrice * 1.23, NCL.Preco / 1.23), 0) AS PVenda,
ISNULL(ISNULL(TL.SAFT_SettlementAmount * 1.23, NCL.Desconto / 1.23), 0) AS Desconto,

0 AS Margem,
0 AS MargemPCT
FROM
Tbl_Produtos_Movimentos PM INNER JOIN
Tbl_Produtos P on PM.ID_Produto=P.ID_Produto INNER JOIN
Tbl_Tipo_de_Documentos TD ON PM.ID_Tipo_de_Documento = TD.ID_Tipo_de_Documentos LEFT OUTER JOIN
Tbl_Ticket_Linhas TL ON PM.N_Documento = TL.id_Ticket AND PM.id_Produto = TL.id_Produto AND PM.ID_Tipo_de_Documento=1 LEFT OUTER JOIN
TblNotasCredito NC ON NC.idTicket = TL.ID_Ticket LEFT OUTER JOIN
TblNotasCreditoLinhas NCL ON PM.N_Documento = NCL.idNotaCredito AND PM.id_Produto = NCL.idProduto AND PM.ID_Tipo_de_Documento=19
WHERE
P.ID_Produto = 265005
ORDER BY
PM.Data

a query do cursor
DECLARE @Modelo VARCHAR(30), @Data SMALLDATETIME, @rowID BIGINT, @lastRowID BIGINT, @ValorTotal NUMERIC (18,2)

SET @lastRowID = 0
SET @rowID = 0

DECLARE cursorLinha CURSOR FOR
SELECT
PM.ID_Movimento,
P.Modelo,
P.Data
FROM
Tbl_Produtos_Movimentos PM INNER JOIN
Tbl_Produtos P on PM.ID_Produto=P.ID_Produto INNER JOIN
Tbl_Tipo_de_Documentos TD ON PM.ID_Tipo_de_Documento = TD.ID_Tipo_de_Documentos LEFT OUTER JOIN
Tbl_Ticket_Linhas TL ON PM.N_Documento = TL.id_Ticket AND PM.id_Produto = TL.id_Produto AND PM.ID_Tipo_de_Documento=1 LEFT OUTER JOIN
TblNotasCredito NC ON TL.ID_Ticket = NC.idTicket

WHERE
P.ID_Produto = 265005
ORDER BY
PM.Data

OPEN cursorLinha
FETCH NEXT FROM cursorLinha INTO @rowID, @Modelo, @Data
WHILE @@FETCH_STATUS=0
BEGIN
--PRINT @LastrowID
--PRINT @rowID

IF @lastRowID = 0
BEGIN
UPDATE
Tbl_PCM
SET
ValorTotal = TotalDoc,
PCM = (SELECT P_Custo FROM Tbl_PCM WHERE rowID = 1)

WHERE
idLinha=@rowID
END
ELSE
BEGIN
SELECT @ValorTotal = ValorTotal FROM Tbl_PCM WHERE idLinha = @lastRowID
UPDATE
Tbl_PCM
SET
Tbl_PCM.ValorTotal = Tmp_PCM.TotalDoc + @ValorTotal,
Tbl_PCM.PCM = ((Tmp_PCM.TotalDoc + @ValorTotal)/Tmp_PCM.StockAcumulado),
Tbl_PCM.Margem = (Tmp_Produtos_Movimentos.PVenda - Tmp_PCM.PCM),
Tbl_PCM.MargemPCT = (Tmp_PCM.PCM - Tmp_Produtos_Movimentos.PVenda)/Tmp_Produtos_Movimentos.PVenda


FROM
Tbl_PCM Tmp_PCM INNER JOIN
Tbl_Produtos_Movimentos Tmp_Produtos_Movimentos ON Tmp_PCM.idLinha = Tmp_Produtos_Movimentos.ID_Movimento

WHERE
Tmp_PCM.idLinha=@rowID
END

SET @lastRowID = @rowID
FETCH NEXT FROM cursorLinha INTO @rowID, @Modelo, @Data
END
CLOSE cursorLinha
DEALLOCATE cursorLinha


ps: sou muito verde nestas coisas pelo que tenho mesm mts duvidas
Responder

28/10/2015

Marcos P

Sempre que postar código no fórum, use a tag "Inserir Código" ( aí em cima... ).

Seu código tem vários problemas... dentre eles, destaco dois :

1. Falta identação... sem isso é virtualmente impossível analisar o que você está tentando fazer !
2. Valores fixos no código... esses valores são constantes ou você os colocou apenas como exemplo ?

Favor revisar seu código, inserindo a identação !

Atente para o seguinte : quem se propor a lhe ajudar não tem o mínimo conhecimento da sua estrutura e necessidade, então, você precisa ser o mais claro possível, para obter sucesso.

Sua dificuldades, pelo que entendi, reside nas colunas "calculadas"... é isso ?

Em todas elas ou apenas determinadas colunas ?

Independentemente da sintaxe SQL, você domina as regras de negócio para definir as condições de "cálculo" de cada uma dessas colunas ?

Fico no aguardo de seus ajustes...
Responder

28/10/2015

Alex Lekao

acompanhando.
Responder

29/10/2015

Luis

Sempre que postar código no fórum, use a tag "Inserir Código" ( aí em cima... ).

Seu código tem vários problemas... dentre eles, destaco dois :

1. Falta identação... sem isso é virtualmente impossível analisar o que você está tentando fazer !
2. Valores fixos no código... esses valores são constantes ou você os colocou apenas como exemplo ?

Favor revisar seu código, inserindo a identação !

Atente para o seguinte : quem se propor a lhe ajudar não tem o mínimo conhecimento da sua estrutura e necessidade, então, você precisa ser o mais claro possível, para obter sucesso.

Sua dificuldades, pelo que entendi, reside nas colunas "calculadas"... é isso ?

Em todas elas ou apenas determinadas colunas ?

Independentemente da sintaxe SQL, você domina as regras de negócio para definir as condições de "cálculo" de cada uma dessas colunas ?

Fico no aguardo de seus ajustes...


Mais uma vez, agradeço a atençao!

A questao é mais complexa do que eu consegui fazer passar.
sou estagiario numa empresa e deram-me este mini projeto para ver se consigo aprender algo.
mas chegou a um ponto que esta a ficar dificil. O foi nos explicado como se calcula tudo mas o meu problema esta na logica. O pcm deve ficar sempre igual até haver uma entrada em stock.

a primeira coisa a fazer era uma tabela chamada pcm.
para colocar dados na tabela teria de ir buscar os dados a outras tabelas (fiz insert into e dentro desse insert um select e dentro desse select todo o codigo para colocar dados nos campos). alguns campos precisei de criar um cursor.

INSERT INTO Tbl_PCM(
idLinha,
Data,
TipoDocumento,
NDocumento,
Modelo,
Entrada,
Saida,
StockAcumulado,
P_Custo,
TotalDoc,
ValorTotal,
PCM,
PVenda,
Desconto,
Margem,
MargemPCT
)

SELECT
PM.ID_Movimento,
PM.Data,
Td.Tipo_Documento,
PM.N_Documento,
P.Modelo,
PM.Entrada,
PM.Saida,
(SELECT SUM(Entrada-Saida) FROM Tbl_Produtos_Movimentos WHERE ID_Produto = P.ID_Produto AND Data <= PM.Data) AS Acumulado,
CASE TD.Tipo_Documento
WHEN 'Nota Credito' THEN (SELECT TmpPM.P_Custo FROM Tbl_Produtos_Movimentos TmpPM WHERE TmpPM.ID_Tipo_de_Documento=1 AND TmpPM.N_Documento=NC.idTicket AND TmpPM.ID_Produto = NCL.idProduto)
ELSE PM.P_Custo
END AS P_Custo,
CASE TD.Tipo_Documento
WHEN 'Nota Credito' THEN (SELECT TmpPM.P_Custo FROM Tbl_Produtos_Movimentos TmpPM WHERE TmpPM.ID_Tipo_de_Documento=1 AND TmpPM.N_Documento=NC.idTicket AND TmpPM.ID_Produto = NCL.idProduto)
ELSE PM.P_Custo
END * (PM.entrada - PM.saida) AS TotalDoc,


0 AS ValorTotal,
0 AS PCM,
ISNULL(ISNULL(TL.SAFT_UnitPrice * 1.23, NCL.Preco / 1.23), 0) AS PVenda,
ISNULL(ISNULL(TL.SAFT_SettlementAmount * 1.23, NCL.Desconto / 1.23), 0) AS Desconto,

0 AS Margem,
0 AS MargemPCT
FROM
Tbl_Produtos_Movimentos PM INNER JOIN
Tbl_Produtos P on PM.ID_Produto=P.ID_Produto INNER JOIN
Tbl_Tipo_de_Documentos TD ON PM.ID_Tipo_de_Documento = TD.ID_Tipo_de_Documentos LEFT OUTER JOIN
Tbl_Ticket_Linhas TL ON PM.N_Documento = TL.id_Ticket AND PM.id_Produto = TL.id_Produto AND PM.ID_Tipo_de_Documento=1 LEFT OUTER JOIN
TblNotasCreditoLinhas NCL ON PM.N_Documento = NCL.idNotaCredito AND PM.id_Produto = NCL.idProduto AND PM.ID_Tipo_de_Documento=19 LEFT OUTER JOIN
TblNotasCredito NC ON NC.idNotaCredito = NCL.idNotaCredito
WHERE
P.ID_Produto = 265005
ORDER BY
PM.Data



DECLARE @Modelo VARCHAR(30), @Data SMALLDATETIME, @rowID BIGINT, @lastRowID BIGINT, @ValorTotal NUMERIC (18,2)

SET @lastRowID = 0
SET @rowID = 0

DECLARE cursorLinha CURSOR FOR
SELECT
PM.ID_Movimento,
P.Modelo,
P.Data
FROM
Tbl_Produtos_Movimentos PM INNER JOIN
Tbl_Produtos P on PM.ID_Produto=P.ID_Produto INNER JOIN
Tbl_Tipo_de_Documentos TD ON PM.ID_Tipo_de_Documento = TD.ID_Tipo_de_Documentos LEFT OUTER JOIN
Tbl_Ticket_Linhas TL ON PM.N_Documento = TL.id_Ticket AND PM.id_Produto = TL.id_Produto AND PM.ID_Tipo_de_Documento=1 LEFT OUTER JOIN
TblNotasCredito NC ON TL.ID_Ticket = NC.idTicket

WHERE
P.ID_Produto = 265005
ORDER BY
PM.Data

OPEN cursorLinha
FETCH NEXT FROM cursorLinha INTO @rowID, @Modelo, @Data
WHILE @@FETCH_STATUS=0
BEGIN


IF @lastRowID = 0
BEGIN
UPDATE
Tbl_PCM
SET
ValorTotal = TotalDoc,
PCM = (SELECT P_Custo FROM Tbl_PCM WHERE rowID = 1)

WHERE
idLinha=@rowID
END
ELSE
BEGIN
SELECT @ValorTotal = ValorTotal FROM Tbl_PCM WHERE idLinha = @lastRowID
UPDATE
Tbl_PCM
SET
Tbl_PCM.ValorTotal = Tmp_PCM.TotalDoc + @ValorTotal,
Tbl_PCM.PCM = ((Tmp_PCM.TotalDoc + @ValorTotal)/Tmp_PCM.StockAcumulado),
Tbl_PCM.Margem = (Tmp_Produtos_Movimentos.PVenda - Tmp_PCM.PCM),
Tbl_PCM.MargemPCT = (Tmp_PCM.PCM - Tmp_Produtos_Movimentos.PVenda)/Tmp_Produtos_Movimentos.PVenda


FROM
Tbl_PCM Tmp_PCM INNER JOIN
Tbl_Produtos_Movimentos Tmp_Produtos_Movimentos ON Tmp_PCM.idLinha = Tmp_Produtos_Movimentos.ID_Movimento

WHERE
Tmp_PCM.idLinha=@rowID
END

SET @lastRowID = @rowID
FETCH NEXT FROM cursorLinha INTO @rowID, @Modelo, @Data
END
CLOSE cursorLinha
DEALLOCATE cursorLinha

ps: como posso indentar melhor o codigo?
Responder

29/10/2015

Luis

INSERT INTO Tbl_PCM(
	idLinha,
	Data,
	TipoDocumento,	
	NDocumento,
	Modelo,
	Entrada,
	Saida,
	StockAcumulado,
	P_Custo,
	TotalDoc,
	ValorTotal,
	PCM,
	PVenda,
	Desconto,
	Margem,
	MargemPCT 
	)

SELECT 
	PM.ID_Movimento,
	PM.Data,
	Td.Tipo_Documento,
	PM.N_Documento,
	P.Modelo, 
	PM.Entrada,
	PM.Saida,
	(SELECT SUM(Entrada-Saida) FROM Tbl_Produtos_Movimentos WHERE ID_Produto = P.ID_Produto AND Data <= PM.Data) AS Acumulado,
	CASE TD.Tipo_Documento
		WHEN 'Nota Credito' THEN (SELECT TmpPM.P_Custo FROM Tbl_Produtos_Movimentos TmpPM  WHERE TmpPM.ID_Tipo_de_Documento=1 AND TmpPM.N_Documento=NC.idTicket AND TmpPM.ID_Produto = NCL.idProduto)
		ELSE PM.P_Custo 
	END AS P_Custo,
	CASE TD.Tipo_Documento
		WHEN 'Nota Credito' THEN (SELECT TmpPM.P_Custo FROM Tbl_Produtos_Movimentos TmpPM  WHERE TmpPM.ID_Tipo_de_Documento=1 AND TmpPM.N_Documento=NC.idTicket AND TmpPM.ID_Produto = NCL.idProduto)
		ELSE PM.P_Custo 
	END * (PM.entrada - PM.saida) AS TotalDoc,	
	
	0 AS ValorTotal,
	0 AS PCM,
	ISNULL(ISNULL(TL.SAFT_UnitPrice * 1.23, NCL.Preco / 1.23), 0) AS PVenda,
	ISNULL(ISNULL(TL.SAFT_SettlementAmount * 1.23, NCL.Desconto / 1.23), 0) AS Desconto,
	
	0 AS Margem,
	0 AS MargemPCT
FROM 
	Tbl_Produtos_Movimentos PM INNER JOIN
	Tbl_Produtos P on PM.ID_Produto=P.ID_Produto INNER JOIN
	Tbl_Tipo_de_Documentos TD ON PM.ID_Tipo_de_Documento = TD.ID_Tipo_de_Documentos LEFT OUTER JOIN
	Tbl_Ticket_Linhas TL ON PM.N_Documento = TL.id_Ticket AND PM.id_Produto = TL.id_Produto AND PM.ID_Tipo_de_Documento=1 LEFT OUTER JOIN
	TblNotasCreditoLinhas NCL ON PM.N_Documento = NCL.idNotaCredito AND PM.id_Produto = NCL.idProduto AND PM.ID_Tipo_de_Documento=19 LEFT OUTER JOIN
	TblNotasCredito NC ON NC.idNotaCredito = NCL.idNotaCredito
WHERE
	P.ID_Produto = 265005
ORDER BY
	PM.Data

/*cursor*/

DECLARE @Modelo VARCHAR(30), @Data SMALLDATETIME, @rowID BIGINT, @lastRowID BIGINT, @ValorTotal NUMERIC (18,2)

SET @lastRowID = 0
SET @rowID = 0
 

DECLARE cursorLinha CURSOR FOR
	SELECT
		PM.ID_Movimento,
		P.Modelo,
		P.Data
	FROM 
	Tbl_Produtos_Movimentos PM INNER JOIN
	Tbl_Produtos P on PM.ID_Produto=P.ID_Produto INNER JOIN
	Tbl_Tipo_de_Documentos TD ON PM.ID_Tipo_de_Documento = TD.ID_Tipo_de_Documentos LEFT OUTER JOIN
	Tbl_Ticket_Linhas TL ON PM.N_Documento = TL.id_Ticket AND PM.id_Produto = TL.id_Produto AND PM.ID_Tipo_de_Documento=1 LEFT OUTER JOIN
	TblNotasCredito NC ON TL.ID_Ticket = NC.idTicket
	
WHERE
	P.ID_Produto = 265005
ORDER BY
	PM.Data
	
	OPEN cursorLinha 
	FETCH NEXT FROM cursorLinha INTO @rowID, @Modelo, @Data
	WHILE @@FETCH_STATUS=0 
	BEGIN
	--PRINT @LastrowID
	--PRINT @rowID

		IF @lastRowID = 0
		
		BEGIN
			UPDATE 
				Tbl_PCM 
			SET 
				ValorTotal = TotalDoc,
				PCM = (SELECT P_Custo FROM Tbl_PCM WHERE rowID = 1)
				
			WHERE
				idLinha=@rowID
		END
		
		ELSE
		
		BEGIN
			SELECT @ValorTotal = ValorTotal FROM Tbl_PCM WHERE idLinha = @lastRowID
			
			UPDATE 
				Tbl_PCM 
			SET 
				Tbl_PCM.ValorTotal = Tmp_PCM.TotalDoc + @ValorTotal,
				--PCM = (SELECT Tbl_PCM.TotalDoc
				--Tbl_PCM.PCM = ((Tmp_PCM.TotalDoc + @ValorTotal)/Tmp_PCM.StockAcumulado),
				Tbl_PCM.Margem = (Tmp_Produtos_Movimentos.PVenda - Tmp_PCM.PCM),
				Tbl_PCM.MargemPCT = (Tmp_PCM.PCM - Tmp_Produtos_Movimentos.PVenda)/Tmp_Produtos_Movimentos.PVenda
		
			
			FROM
				Tbl_PCM Tmp_PCM INNER JOIN
				Tbl_Produtos_Movimentos Tmp_Produtos_Movimentos ON Tmp_PCM.idLinha = Tmp_Produtos_Movimentos.ID_Movimento
			
			WHERE 
				Tmp_PCM.idLinha=@rowID 			
		END
		
		
	
	SET @lastRowID = @rowID
	FETCH NEXT FROM cursorLinha INTO @rowID, @Modelo, @Data
	END
CLOSE cursorLinha
DEALLOCATE cursorLinha




Entao por partes vou tentar:

Vc esta a ver a coluna pcm ? para calcular o valor a colocar nessa coluna preciso de fazer isto: (@valorTotal+totalDoc)/StockAcumulado. Mas na primeira linha não se faz este calculo porque o tipo de documento é stock inicial e no stock inical o pcm é igual ao pcusto da primeira linha.
acontece que o pcm sofre alteraçoes quando existe uma entrada de stock. ou seja caso haja alguma entrada o pcm deve ser recalculado.
Responder

29/10/2015

Marcos P

Você tem Skype ou Gtalk ?

Coloca teu contato aqui, que te chamo na sequencia...
Responder

29/10/2015

Luis

Você tem Skype ou Gtalk ?

Coloca teu contato aqui, que te chamo na sequencia...


contacto do meu skype:
lr.g_1

só estarei disponivel a partir das 19h00 em portugal (n sei se lhe dá jeito a essa hora no brasil)
se não, só no fds caso vc esteja acessivel.
Mais uma vez mt obrigado pela pachorra e pela disponibilidade
cumprimentos
Responder

29/10/2015

Marcos P

Falamos a tarde...
Responder

29/10/2015

Marcos P

Meu skype não reconheceu esse seu contato.

Envie-me seu endereço de email, que eu lhe passo meus dados de contato...
Responder

29/10/2015

Luis

Meu skype não reconheceu esse seu contato.

Envie-me seu endereço de email, que eu lhe passo meus dados de contato...


lr.g@hotmail.com
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar