Fórum Query do sql #6136

27/05/2009

0

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
Carlos Faria

Carlos Faria

Responder

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
Responder

Gostei + 0

30/05/2009

Carlos Faria

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   
Responder

Gostei + 0

31/05/2009

Carlos Faria

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
Responder

Gostei + 0

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


Responder

Gostei + 0

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


Responder

Gostei + 0

31/05/2009

Carlos Faria

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
Responder

Gostei + 0

31/05/2009

Carlos Faria

Msg 195, Level 15, State 10, Procedure PROC_VISUALIZA_CAIXA, Line 8 'FNC_GET_LANCAMENTORECEITA' is not a recognized built-in function name.
Responder

Gostei + 0

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!
Responder

Gostei + 0

31/05/2009

Carlos Faria

Rodrigo   Eu rodei sim a function ta criada mais esta dando esse erro !
Responder

Gostei + 0

31/05/2009

Carlos Faria

Msg 195, Level 15, State 10, Procedure PROC_VISUALIZA_CAIXA, Line 8 'FNC_GET_LANCAMENTORECEITA' is not a recognized built-in function name.
Responder

Gostei + 0

31/05/2009

Carlos Faria

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
Responder

Gostei + 0

31/05/2009

Carlos Faria

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.
Responder

Gostei + 0

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 !!
Responder

Gostei + 0

01/06/2009

Carlos Faria

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
Responder

Gostei + 0

01/06/2009

Carlos Faria

Ola Rodrigo   Podemos encerrar hoje esse chamado ?
Responder

Gostei + 0

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

Aceitar