Fórum Query do sql #6136
27/05/2009
Ola amigos da consultoria
como o rodrigo carreiro ja tem uma copia do meu banco de dados ai se quizerem passar acho que facilita
eu nao sei por qual o motivo essa query nao esta funcionando corretamente
-- Author: Regis
-- Create date: 24/05/2009 09:03:00
-- Description: Consulta no caixa ABERTO
CREATE PROCEDURE PRS_CONSULTA_CAIXA_ABERTO
AS
BEGIN
SET NOCOUNT ON;
SELECT
RIGHT(CONVERT(VARCHAR,A.DT_LANCAMENTO),6) AS HORA,
k.dt_abertura,
B.DS_TIPO_LANCAMENTO,
A.VL_LANCAMENTO,
A.NR_MATRICULA,
D.Usuario,
D.NM_USUARIO ,
A.ID_ABERTURA_CAIXA ,
VL_DESPESA = CASE B.Fl_Receita WHEN 1 THEN 0 ELSE A.VL_LANCAMENTO END,
VL_RECEITA = CASE B.Fl_Receita WHEN 1 THEN A.VL_LANCAMENTO ELSE 0 END,
VL_SALDO = CASE B.Fl_Receita WHEN 1 THEN A.VL_LANCAMENTO ELSE 0 END -CASE B.Fl_Receita WHEN 1 THEN 0 ELSE A.VL_LANCAMENTO END,
B.Fl_Receita
FROM TB_MOVIMENTACAO_CAIXA AS A
INNER JOIN TB_TIPO_LANCAMENTO AS B ON A.ID_TIPO_LANCAMENTO=B.ID_TIPO_LANCAMENTO
left JOIN TB_FECHAMENTO_CAIXA AS F ON A.ID_ABERTURA_CAIXA=F.ID_ABERTURA_CAIXA
inner join tb_abertura_caixa as k on a.id_abertura_caixa = K.id_abertura_caixa
left JOIN USUARIO AS D ON A.ID_FUNCIONARIO = D.ID_USUARIO
WHERE F.DT_FECHAMENTO IS NULL
order by id_movimentacao desc
END
essa proc tem funcionar da seguinte maneira
tem que ser um resumo das atividades do caixa em aberto , trazer quantos lancamentos foram realizados if despesas quantos ? nao sei trabalhar com if no sql so case mesmo
e o mais incrivel e que ela nao retorna o valor das depesas ta somando tudo
Posts
28/05/2009
Rodrigo Mourão
Olá Carlos,
Eu rodei seu select aqui, simulei alguns dados de Receita outros de Despesas. Bem o select retornou certo, os registros com sues respectivos valores etc.
Qual o problema que está ocorrendo? Você diz no final do seu post que tinha que trazer a quantidade. O que você quer que seja exibido: O total de receita e despesa, tipo
Despesas 1000,00 Receita 5000,00
ou entao
25 Despesas 30 Receitas
ou você quer mostrar cada uma deles e no final o total ???
Preciso saber o que realmente precisa pois o select está corredo do ponto de vista de trazer os dados de acordo com a condição estabelecida.
No aguardo, abs.
Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
Ola Wesley
peço desculpas por nao ter resolvido os chamados hoje ,estou correndo atraz de resolver aquele maldito problema com a maldita da imprensora bematech mp20 ou caso contrario todo meu projeto esta ameaçãdo de ser migrado para outra linguagem e claro outro programador vai tomar meu lugar tambem.
Nao to afim que isso aconteça.
Vou passar o fim de semana consultando paes de santo, mae Dina,Mãe de santo o que for preciso para resolver aquele maldito e no maximo ate na terça se eu ainda tiver emprego eu respondo todos os chamados
Ola Rodrigo
vamos la na verdade eu te enviei a proc errada realmente com essa ai ta tudo certo a proc verdadeira é essa aqui
--REGIS
--28/05/2009 01:20
--RESUME TODA A MOVIMENTAL DE TAL CAIXA
alter PROCEDURE PROC_VISUALIZA_CAIXA
(@CAIXA INT )
AS
SELECT TOP 1 M.ID_ABERTURA_CAIXA as CAIXA ,
A.DT_ABERTURA,
U.USUARIO,
U.NM_USUARIO,
B.DT_FECHAMENTO,
(select count (m.id_abertura_caixa) from tb_movimentacao_caixa as m inner join tb_tipo_lancamento as t on m.id_tipo_lancamento =t.id_tipo_lancamento where t.fl_receita = 1 AND ID_ABERTURA_CAIXA = @CAIXA ) AS LANCAMENTORECEITAS ,
(select count (m.id_abertura_caixa) from tb_movimentacao_caixa as m inner join tb_tipo_lancamento as t on m.id_tipo_lancamento =t.id_tipo_lancamento where t.fl_receita = 0 AND ID_ABERTURA_CAIXA = @CAIXA ) AS LANCAMENTODESPESAS ,
-(select SUM (m.VL_LANCAMENTO) from tb_movimentacao_caixa as m inner join tb_tipo_lancamento as t on m.id_tipo_lancamento =t.id_tipo_lancamento where t.fl_receita = 0 AND ID_ABERTURA_CAIXA = @CAIXA ) AS TOTALDESPESAS ,
(select SUM (m.VL_LANCAMENTO) from tb_movimentacao_caixa as m inner join tb_tipo_lancamento as t on m.id_tipo_lancamento =t.id_tipo_lancamento where t.fl_receita = 1 AND ID_ABERTURA_CAIXA = @CAIXA ) AS TOTALRECEITAS
-- VL_SALDO = CASE T.Fl_Receita WHEN 1 THEN M.VL_LANCAMENTO ELSE 0 END -CASE T.Fl_Receita WHEN 1 THEN 0 ELSE M.VL_LANCAMENTO END
FROM TB_MOVIMENTACAO_CAIXA AS M INNER JOIN
TB_TIPO_LANCAMENTO AS T ON T.ID_TIPO_LANCAMENTO =M.ID_TIPO_LANCAMENTO INNER JOIN
TB_ABERTURA_CAIXA AS A ON M.ID_ABERTURA_CAIXA =A.ID_ABERTURA_CAIXA LEFT JOIN
TB_FECHAMENTO_CAIXA AS B ON M.ID_ABERTURA_CAIXA =B.ID_ABERTURA_CAIXA inner join
USUARIO AS U ON M.ID_FUNCIONARIO =U.ID_USUARIO
WHERE M.ID_ABERTURA_CAIXA = @CAIXA
ele esta funcionando corretamento porem do meu jeitinho que eu dei aqui mais precisamos corrigir esses jeitinhos
primeito deles observe a intrução SELECT TOP 1 M.ID_ABERTURA_CAIXA as CAIXA é uma gambiarra mais que esta funcionando tive que colocar o top 1 ali caso o sql me mostra 3 results com os mesmos valores isso é um erro onde eu ate modestia parte falando entendo bem de sql mais nao consegui resolve-lo
segundo erro essas subquery fica dificil demais dar manuntencao ou entender um codigo desses no futuro deve ter uma maneira melhor de fazer isso
terceiro e ultimo essa proc deve funcionar da seguinte maneira
o usuario passar o parametro @caixa que e o caixa que esta aberto e ela resume em unica linha
Totallancamentosreceita ,totallancamentosdespesa,totalreceita,totalsaida,totalsaldo e mesmo que seja nao tenha nada la para mostrar nenhum lancamento ela tem que me trazer um select mostrando data de abertura do caixa e 0 nos campos nulls
se vc preciser de uma copia atualizada do banco eu te envio ok
31/05/2009
Rodrigo Mourão
Vamos lá Carlos, vamos simplificar isso ai atraves de funções. Eu vou criar uma aqui como exemplo e quero que voce crie as outras. Vamos pegar os valores de LANCAMENTORECEITAS, LANCAMENTODESPESAS, TOTALDESPESAS, TOTALRECEITAS.
Por exemplo, veja como ficaria a primeira função:
CREATE Function FNC_GET_LANCAMENTORECEITA(@IDCX int)
RETURNS Int
AS
BEGIN
DECLARE @Retorno int
SET @Retorno=(select count (m.id_abertura_caixa) from tb_movimentacao_caixa as m inner join tb_tipo_lancamento as t on
m.id_tipo_lancamento =t.id_tipo_lancamento where t.fl_receita = 1 AND m.ID_ABERTURA_CAIXA = @IDCX )
IF @Retorno IS NULL
SET @Retorno = 0
RETURN @Retorno
END
Essa função acima vai retornar a quantidade de lançamentos de receita ou zero se nao tiver nada. Repare como ficará sua procedure com ela:
alter PROCEDURE PROC_VISUALIZA_CAIXA (@CAIXA INT )
AS
SELECT DISTINCT M.ID_ABERTURA_CAIXA as CAIXA ,
A.DT_ABERTURA,
U.USUARIO,
U.NM_USUARIO,
B.DT_FECHAMENTO,
LANCAMENTORECEITAS = FNC_GET_LANCAMENTORECEITA,
(select count (m.id_abertura_caixa) from tb_movimentacao_caixa as m inner join tb_tipo_lancamento as t on m.id_tipo_lancamento =t.id_tipo_lancamento where t.fl_receita = 0 AND ID_ABERTURA_CAIXA = @CAIXA ) AS LANCAMENTODESPESAS ,
-(select SUM (m.VL_LANCAMENTO) from tb_movimentacao_caixa as m inner join tb_tipo_lancamento as t on m.id_tipo_lancamento =t.id_tipo_lancamento where t.fl_receita = 0 AND ID_ABERTURA_CAIXA = @CAIXA ) AS TOTALDESPESAS ,
(select SUM (m.VL_LANCAMENTO) from tb_movimentacao_caixa as m inner join tb_tipo_lancamento as t on m.id_tipo_lancamento =t.id_tipo_lancamento where t.fl_receita = 1 AND ID_ABERTURA_CAIXA = @CAIXA ) AS TOTALRECEITAS
--VL_SALDO = CASE T.Fl_Receita WHEN 1 THEN M.VL_LANCAMENTO ELSE 0 END -CASE T.Fl_Receita WHEN 1 THEN 0 ELSE M.VL_LANCAMENTO END
FROM TB_MOVIMENTACAO_CAIXA AS M INNER JOIN
TB_TIPO_LANCAMENTO AS T ON T.ID_TIPO_LANCAMENTO =M.ID_TIPO_LANCAMENTO INNER JOIN
TB_ABERTURA_CAIXA AS A ON M.ID_ABERTURA_CAIXA =A.ID_ABERTURA_CAIXA LEFT JOIN
TB_FECHAMENTO_CAIXA AS B ON M.ID_ABERTURA_CAIXA =B.ID_ABERTURA_CAIXA inner join
USUARIO AS U ON M.ID_FUNCIONARIO =U.ID_USUARIO
WHERE M.ID_ABERTURA_CAIXA = @CAIXA
Veja as linhas em vermelho, o distinct serve para não replicar registros iguais, correto ? E eu substitui um sub select pela funcão que eu criei. Agora faça o mesmo, crie mais tres funcoes assim como eu fiz.
Abs,
Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
31/05/2009
Rodrigo Mourão
Corrigindo:
LANCAMENTORECEITAS = FNC_GET_LANCAMENTORECEITA(@caixa)
Abs
Atenciosamente,
Rodrigo Carreiro Mourão
Borland Instructor Certified
Coordenador da Consultoria em Delphi
Ola Rodrigo
Maravilha de exemplo porem ao executar aqui no sqlserver ta dando um erro que nao consegui localizar
Msg 207, Level 16, State 1, Procedure PROC_VISUALIZA_CAIXA, Line 8
Invalid column name 'FNC_GET_LANCAMENTORECEITA'.
parece que ele nao ta achando a function
Msg 195, Level 15, State 10, Procedure PROC_VISUALIZA_CAIXA, Line 8
'FNC_GET_LANCAMENTORECEITA' is not a recognized built-in function name.
31/05/2009
Rodrigo Mourão
Carlos você rodou o script para criar a funcao no banco. Tem que criar a funcao no banco primeiro. Repare que o primeiro codigo que te mandei foi para criar a funcao depois altera a procedure.
Abs!
Rodrigo
Eu rodei sim a function ta criada mais esta dando esse erro !
Msg 195, Level 15, State 10, Procedure PROC_VISUALIZA_CAIXA, Line 8
'FNC_GET_LANCAMENTORECEITA' is not a recognized built-in function name.
create Function FNC_GET_LANCAMENTORECEITA(@CAIXA Int)
RETURNS Int
AS
BEGIN
DECLARE @Retorno int
SET @Retorno=(select count (m.id_abertura_caixa) from tb_movimentacao_caixa as m inner join tb_tipo_lancamento as t on
m.id_tipo_lancamento =t.id_tipo_lancamento where t.fl_receita = 1 AND m.ID_ABERTURA_CAIXA = @CAIXA )
IF @Retorno IS NULL SET @Retorno = 0
RETURN @Retorno
END
--------------------------------------------------------------------------------------------------------
alter PROCEDURE PROC_VISUALIZA_CAIXA (@CAIXA INT )
AS
SELECT DISTINCT M.ID_ABERTURA_CAIXA as CAIXA ,
A.DT_ABERTURA,
U.USUARIO,
U.NM_USUARIO,
B.DT_FECHAMENTO,
lancamentosreceita = FNC_GET_LANCAMENTORECEITA (@CAIXA)
FROM TB_MOVIMENTACAO_CAIXA AS M INNER JOIN
TB_TIPO_LANCAMENTO AS T ON T.ID_TIPO_LANCAMENTO =M.ID_TIPO_LANCAMENTO INNER JOIN
TB_ABERTURA_CAIXA AS A ON M.ID_ABERTURA_CAIXA =A.ID_ABERTURA_CAIXA LEFT JOIN
TB_FECHAMENTO_CAIXA AS B ON M.ID_ABERTURA_CAIXA =B.ID_ABERTURA_CAIXA inner join
USUARIO AS U ON M.ID_FUNCIONARIO =U.ID_USUARIO
WHERE M.ID_ABERTURA_CAIXA = @CAIXA
VEJA COMO FICOU AS FUNCTIONS
CREATE Function FNC_GET_LANCAMENTORECEITA(@IDCX int)
RETURNS Int
AS
BEGIN
DECLARE @Retorno int SET @Retorno=(select count (m.id_abertura_caixa) from tb_movimentacao_caixa as m inner join tb_tipo_lancamento as t on m.id_tipo_lancamento =t.id_tipo_lancamento where t.fl_receita = 1 AND m.ID_ABERTURA_CAIXA = @IDCX )
IF @Retorno IS NULL SET @Retorno = 0 RETURN @Retorno
END
CREATE Function FNC_GET_LANCAMENTODESPESA(@IDCX int)
RETURNS Int
AS
BEGIN
DECLARE @Retorno int
SET @Retorno=(select count (m.id_abertura_caixa) from tb_movimentacao_caixa as m inner join tb_tipo_lancamento as t on
m.id_tipo_lancamento =t.id_tipo_lancamento where t.fl_receita = 0 AND m.ID_ABERTURA_CAIXA = @IDCX ) IF @Retorno IS NULL SET @Retorno = 0 RETURN @Retorno
END
CREATE Function FNC_GET_SOMARECEITA(@IDCX int)
RETURNS Int
AS
BEGIN
DECLARE @Retorno int
SET @Retorno=(select SUM (m.VL_LANCAMENTO) from tb_movimentacao_caixa as m inner join tb_tipo_lancamento as t on
m.id_tipo_lancamento =t.id_tipo_lancamento where t.fl_receita = 1 AND m.ID_ABERTURA_CAIXA = @IDCX ) IF @Retorno IS NULL SET @Retorno = 0 RETURN @Retorno
END
CREATE Function FNC_GET_SOMADESPESA(@IDCX int)
RETURNS Int
AS
BEGIN
DECLARE @Retorno int
SET @Retorno=(select SUM (m.VL_LANCAMENTO) from tb_movimentacao_caixa as m inner join tb_tipo_lancamento as t on
m.id_tipo_lancamento =t.id_tipo_lancamento where t.fl_receita = 0 AND m.ID_ABERTURA_CAIXA = @IDCX ) IF @Retorno IS NULL SET @Retorno = 0 RETURN @Retorno
END
-------------------------------------------------------------------------------------------------
--PROCEDURE
CREATE PROCEDURE PROC_VISUALIZA_CAIXA (@IDCX INT )
AS
SELECT DISTINCT M.ID_ABERTURA_CAIXA as CAIXA ,
A.DT_ABERTURA,
U.USUARIO,
U.NM_USUARIO,
B.DT_FECHAMENTO,
LANCAMENTORECEITAS = FNC_GET_LANCAMENTORECEITA(@IDCX),
LANCAMENTOSDESPESA = FNC_GET_LANCAMENTODESPESA(@IDCX),
SOMARECEITA = FNC_GET_SOMARECEITA(@IDCX),
SOMADESPESA = FNC_GET_SOMADESPESA(@IDCX)
SOMADESPESA =
FROM TB_MOVIMENTACAO_CAIXA AS M INNER JOIN
TB_TIPO_LANCAMENTO AS T ON T.ID_TIPO_LANCAMENTO =M.ID_TIPO_LANCAMENTO INNER JOIN
TB_ABERTURA_CAIXA AS A ON M.ID_ABERTURA_CAIXA =A.ID_ABERTURA_CAIXA LEFT JOIN
TB_FECHAMENTO_CAIXA AS B ON M.ID_ABERTURA_CAIXA =B.ID_ABERTURA_CAIXA inner join
USUARIO AS U ON M.ID_FUNCIONARIO =U.ID_USUARIO
WHERE M.ID_ABERTURA_CAIXA = @IDCX
--NA HORA DE RODAR
----
Msg 195, Level 15, State 10, Procedure PROC_VISUALIZA_CAIXA, Line 8
'FNC_GET_LANCAMENTORECEITA' is not a recognized built-in function name.
31/05/2009
Rodrigo Mourão
Carlos mande um backup novo do seu banco para eu testar nele, se possivel esse que vc ja criou as functions.
Abs !!
OLA Rodrigo
segue o link do banco de dados sqlserver 2005 developer studio e tbem do projeto caso precise no futuro
Tentei gravar uma video para vc ver mais é impossivel enviar direto pelo devmedia so para vc ter uma ideia esse backup do sqlserver gastou 45:minutos para se fazer o upload
projeto
https://www.devmedia.com.br/imagens/discovirtual/187481/20093105.zip
banco de dados sqlserver
https://www.devmedia.com.br/imagens/discovirtual/187481/BACKUP20093105.rar
Ola Rodrigo
Podemos encerrar hoje esse chamado ?