SQL - Atualizar tabelas
28/10/2015
0
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
Post mais votado
29/10/2015
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
Mais Posts
28/10/2015
Marcos P
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.
28/10/2015
Luis
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
28/10/2015
Marcos P
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...
29/10/2015
Luis
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?
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.
29/10/2015
Marcos P
Coloca teu contato aqui, que te chamo na sequencia...
29/10/2015
Luis
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
29/10/2015
Marcos P
Envie-me seu endereço de email, que eu lhe passo meus dados de contato...
29/10/2015
Luis
Envie-me seu endereço de email, que eu lhe passo meus dados de contato...
lr.g@hotmail.com
Clique aqui para fazer login e interagir na Comunidade :)