PROBLEMA COM INSTRUCAO SQL

GUSTAVOCANALLI 10/10/2009 13:40:45
#324985
FIZ UM SCRIPT SQL NO SQL SERVER 2005 PARA RETORNAR PARA O FECHAMENTO DE CAIXA. ESTE SCRIPT RETORNA O SALDO PARA CADA FORMA DE PAGAMENTO (DINHEIRO, CHEQUE, CARTAO, TICKET)

ESTOU FAZENDO ISSO EM UMA PROCEDURE E NO .NET EU LISTO EM UM GRID. O PROBLEMA é QUE OS DADOS RESPECTIVOS AOS SALDOS DE CADA FORMA DE PAGAMENTO NÃO APARECEM NO GRID. FICA TUDO EM BRANCO. SÓ APARECE O USUARIO E AS DATAS

O SCRIPT é ESSE AQUI

CREATE PROC SP_S_PIZ_CONSULTACAIXA
(
@PDATA1 DATETIME,
@PDATA2 DATETIME
)
AS
SELECT DISTINCT
USU.USU_ST_LOGIN,
CAI.CAI_DT_ABERTURA,
CAI.CAI_DT_FECHAMENTO,
((SELECT DISTINCT SUM(ITC_RE_DINHEIRO) FROM PIZ_ITEMCAIXA WHERE ITC_ST_NATUREZA = [ô]CRéDITO[ô]) - (SELECT DISTINCT SUM(ITC_RE_DINHEIRO) FROM PIZ_ITEMCAIXA WHERE ITC_ST_NATUREZA = [ô]DéBITO[ô])),
((SELECT DISTINCT SUM(ITC_RE_CHEQUE) FROM PIZ_ITEMCAIXA WHERE ITC_ST_NATUREZA = [ô]CRéDITO[ô]) - (SELECT DISTINCT SUM(ITC_RE_CHEQUE) FROM PIZ_ITEMCAIXA WHERE ITC_ST_NATUREZA = [ô]DéBITO[ô])),
((SELECT DISTINCT SUM(ITC_RE_CARTAO) FROM PIZ_ITEMCAIXA WHERE ITC_ST_NATUREZA = [ô]CRéDITO[ô]) - (SELECT DISTINCT SUM(ITC_RE_CARTAO) FROM PIZ_ITEMCAIXA WHERE ITC_ST_NATUREZA = [ô]DéBITO[ô])),
((SELECT DISTINCT SUM(ITC_RE_TICKET) FROM PIZ_ITEMCAIXA WHERE ITC_ST_NATUREZA = [ô]CRéDITO[ô]) - (SELECT DISTINCT SUM(ITC_RE_TICKET) FROM PIZ_ITEMCAIXA WHERE ITC_ST_NATUREZA = [ô]DéBITO[ô]))
FROM PIZ_ITEMCAIXA ITC, PIZ_CAIXA CAI, PIZ_USUARIO USU
WHERE CAI.CAI_IN_CODIGO = ITC.CAI_IN_CODIGO
AND CAI.USU_IN_CODIGO = USU.USU_IN_CODIGO
AND CAI.CAI_DT_ABERTURA BETWEEN @PDATA1 AND @PDATA2

ALGUEM PODE ME AJUDAR?

OBRIGADO!
RCMRO 12/10/2009 11:51:26
#325081
Gustavo,

Refiz a sua query, conforme abaixo mas faltou um dado crucial para terminar:
Nos comentários [Ô]--> Aqui[Ô] é preciso colocar uma chave de ligação da tabela [Ô]piz_ItemCaixa[Ô] com a tabela [Ô]piz_Caixa[Ô]. Eu chutei que seria a coluna [Ô]cai_in_codigo[Ô] mas, se não for, precisa colocar então a coluna que acessa ela.
Se tiver dúvida nisso, manda a estrutura das 2 tabelas e eu monto certinho porém, acredito que não será preciso....

PS.: Você estava usando SUB-QUERIES sem limites e isso pode ocorrer em problemas pois TODOS os campos somados que retornassem teriam o mesmo valor. Evite ao máximo o uso de SUB-QUERIES e sempre use uma chave de ligação entre elas.

CREATE PROC sp_s_piz_ConsultaCaixa
(
@pData1 DATETIME,
@pData2 DATETIME
) AS
SELECT DISTINCT
usu.usu_st_login,
cai.cai_dt_abertura,
cai.cai_dt_fechamento,
(SUM(ISNULL(ic1.itc_re_Dinheiro,0)) - SUM(ISNULL(ic2.itc_re_Dinheiro))) Dinheiro,
(SUM(ISNULL(ic1.itc_re_Cheque,0)) - SUM(ISNULL(ic2.itc_re_Cheque))) Cheque,
(SUM(ISNULL(ic1.itc_re_Cartao,0)) - SUM(ISNULL(ic2.itc_re_Cartao))) Cartao,
(SUM(ISNULL(ic1.itc_re_Ticket,0)) - SUM(ISNULL(ic2.itc_re_Ticket))) Ticket
FROM piz_caixa cai WITH(NOLOCK)
INNER JOIN piz_usuario usu WITH(NOLOCK)
ON cai.usu_in_codigo = usu.usu_in_codigo
LEFT JOIN piz_ItemCaixa ic1 WITH(NOLOCK)
ON ic1.cai_in_codigo = cai.cai_in_codigo --> Aqui
AND ic1.itc_st_Natureza = [ô]CRéDITO[ô]
LEFT JOIN piz_ItemCaixa ic2 WITH(NOLOCK)
ON ic2.cai_in_codigo = cai.cai_in_codigo --> Aqui
AND ic2.itc_st_Natureza = [ô]DéBITO[ô]
WHERE cai.cai_dt_abertura BETWEEN @pData1 AND @pData2
ORDER BY usu.usu_st_login, cai.cai_dt_abertura, cai.cai_dt_fechamento
GROUP BY usu.usu_st_login, cai.cai_dt_abertura, cai.cai_dt_fechamento
GUSTAVOCANALLI 12/10/2009 16:27:13
#325091
vixi cara n deu certo nao...
e nao consegui arrumar...n manjo de inner join
vou passar as tabelas, ai tem como voce me ajudar?

CREATE TABLE PIZ_USUARIO
(
USU_IN_CODIGO INT NOT NULL IDENTITY
CONSTRAINT PIZ_PK_USUARIO PRIMARY KEY,
USU_ST_NOME VARCHAR(50) NOT NULL,
USU_ST_LOGIN VARCHAR(20) NOT NULL
CONSTRAINT PIZ_UK_USU_LOGIN UNIQUE,
USU_BI_SENHA VARBINARY(100) NOT NULL,
USU_ST_NIVEL VARCHAR(15) NOT NULL
)

CREATE TABLE PIZ_CAIXA
(
CAI_IN_CODIGO INT IDENTITY
CONSTRAINT PIZ_PK_CAIXA PRIMARY KEY,
USU_IN_CODIGO INT
CONSTRAINT CAI_FK_PIZ_USU FOREIGN KEY REFERENCES PIZ_USUARIO,
CAI_DT_ABERTURA DATETIME,
CAI_DT_FECHAMENTO DATETIME
)

CREATE TABLE PIZ_ITEMCAIXA
(
ITC_IN_CODIGO INT IDENTITY
CONSTRAINT PIZ_PK_ITEMCAIXA PRIMARY KEY,
CAI_IN_CODIGO INT
CONSTRAINT ITC_FK_PIZ_CAI FOREIGN KEY REFERENCES PIZ_CAIXA ON DELETE CASCADE,
ITC_RE_DINHEIRO NUMERIC(12,2),
ITC_RE_CHEQUE NUMERIC(12,2),
ITC_RE_CARTAO NUMERIC(12,2),
ITC_RE_TICKET NUMERIC(12,2),
ITC_ST_NATUREZA VARCHAR(10)
)

Vlw cara!
RCMRO 13/10/2009 12:50:25
#325174
Resposta escolhida
O legal seria ter alguns dados mas, de qualquer forma, fiz os ajustes. Testa a proc alterada...

CREATE PROC sp_s_piz_ConsultaCaixa
(
@pData1 DATETIME,
@pData2 DATETIME
) AS
SELECT DISTINCT
usu.usu_st_login,
cai.cai_dt_abertura,
cai.cai_dt_fechamento,
(SUM(ISNULL(ic1.itc_re_Dinheiro,0)) - SUM(ISNULL(ic2.itc_re_Dinheiro,0))) Dinheiro,
(SUM(ISNULL(ic1.itc_re_Cheque,0)) - SUM(ISNULL(ic2.itc_re_Cheque,0))) Cheque,
(SUM(ISNULL(ic1.itc_re_Cartao,0)) - SUM(ISNULL(ic2.itc_re_Cartao,0))) Cartao,
(SUM(ISNULL(ic1.itc_re_Ticket,0)) - SUM(ISNULL(ic2.itc_re_Ticket,0))) Ticket
FROM piz_caixa cai WITH(NOLOCK)
INNER JOIN piz_usuario usu WITH(NOLOCK)
ON cai.usu_in_codigo = usu.usu_in_codigo
LEFT JOIN piz_ItemCaixa ic1 WITH(NOLOCK)
ON ic1.itc_in_codigo = cai.cai_in_codigo
AND ic1.itc_st_Natureza = [ô]CRéDITO[ô]
LEFT JOIN piz_ItemCaixa ic2 WITH(NOLOCK)
ON ic2.itc_in_codigo = cai.cai_in_codigo
AND ic2.itc_st_Natureza = [ô]DéBITO[ô]
WHERE cai.cai_dt_abertura BETWEEN @pData1 AND @pData2
GROUP BY usu.usu_st_login, cai.cai_dt_abertura, cai.cai_dt_fechamento
ORDER BY usu.usu_st_login, cai.cai_dt_abertura, cai.cai_dt_fechamento
GUSTAVOCANALLI 13/10/2009 14:33:55
#325189
Entao cara.

Deu quase certo, mas ele não está fazendo os calculos. Ele está ignorando os valores cadastrado como débito
RCMRO 13/10/2009 15:39:32
#325194
Para evitar problemas com palavras escritas de forma diferente, substitui as linhas:

AND ic1.itc_st_Natureza = [ô]CRéDITO[ô]
por
AND LEFT(ic1.itc_st_Natureza,1) = [ô]C[ô]

e

AND ic2.itc_st_Natureza = [ô]DéBITO[ô]
por
AND LEFT(ic2.itc_st_Natureza,1) = [ô]D[ô]


Se não funcionar, verifica se realmente os lançamentos a débito têm a Natureza começando por [Ô]D[Ô] pois não tem lógica funcionar para credito e não para débito.
RCMRO 13/10/2009 15:47:17
#325197
Cara,

Dei uma olhada melhor na estrutura das tabelas e peço descupas mas cometi um erro nos 2 LEFT JOIN

Troca tudo pelo código abaixo:
CREATE PROC sp_s_piz_ConsultaCaixa
(
@pData1 DATETIME,
@pData2 DATETIME
) AS
SELECT DISTINCT
usu.usu_st_login,
cai.cai_dt_abertura,
cai.cai_dt_fechamento,
(SUM(ISNULL(ic1.itc_re_Dinheiro,0)) - SUM(ISNULL(ic2.itc_re_Dinheiro,0))) Dinheiro,
(SUM(ISNULL(ic1.itc_re_Cheque,0)) - SUM(ISNULL(ic2.itc_re_Cheque,0))) Cheque,
(SUM(ISNULL(ic1.itc_re_Cartao,0)) - SUM(ISNULL(ic2.itc_re_Cartao,0))) Cartao,
(SUM(ISNULL(ic1.itc_re_Ticket,0)) - SUM(ISNULL(ic2.itc_re_Ticket,0))) Ticket
FROM piz_caixa cai WITH(NOLOCK)
INNER JOIN piz_usuario usu WITH(NOLOCK)
ON cai.usu_in_codigo = usu.usu_in_codigo
LEFT JOIN piz_ItemCaixa ic1 WITH(NOLOCK)
ON ic1.cai_in_codigo = cai.cai_in_codigo
AND LEFT(ic1.itc_st_Natureza,1) = [ô]C[ô]
LEFT JOIN piz_ItemCaixa ic2 WITH(NOLOCK)
ON ic2.cai_in_codigo = cai.cai_in_codigo
AND LEFT(ic2.itc_st_Natureza,1) = [ô]D[ô]
WHERE cai.cai_dt_abertura BETWEEN @pData1 AND @pData2
GROUP BY usu.usu_st_login, cai.cai_dt_abertura, cai.cai_dt_fechamento
ORDER BY usu.usu_st_login, cai.cai_dt_abertura, cai.cai_dt_fechamento
GUSTAVOCANALLI 13/10/2009 20:24:21
#325210
Cara deu certinho, vlw msm

Se não for encomodar, tenho uma ultima pergunta.

Quando eu coloco pra abrir o caixa, eu lanco a data de fechamento como [Ô]10/10/1900[Ô]. Entao eu verifico se a data é [Ô]10/10/1900[Ô], o caixa está aberto. Ai tem como coloca no select uma coisa do tipo, se o registro tiver data de fechamento de [Ô]10/10/1900[Ô] ele retornar em branco somente o campo da data desse registro?

Vlw msm cara, desculpa o encomodo
RCMRO 14/10/2009 00:16:53
#325239
Ai vai como:

CREATE PROC sp_s_piz_ConsultaCaixa
(
@pData1 DATETIME,
@pData2 DATETIME
) AS
SELECT DISTINCT
usu.usu_st_login,
cai.cai_dt_abertura,
CASE cai.cai_dt_fechamento
WHEN [ô]19001010[ô] THEN [ô]EM ABERTO[ô]
ELSE cai.cai_dt_fechamento
END AS cai_dt_fechamento,
(SUM(ISNULL(ic1.itc_re_Dinheiro,0)) - SUM(ISNULL(ic2.itc_re_Dinheiro,0))) Dinheiro,
(SUM(ISNULL(ic1.itc_re_Cheque,0)) - SUM(ISNULL(ic2.itc_re_Cheque,0))) Cheque,
(SUM(ISNULL(ic1.itc_re_Cartao,0)) - SUM(ISNULL(ic2.itc_re_Cartao,0))) Cartao,
(SUM(ISNULL(ic1.itc_re_Ticket,0)) - SUM(ISNULL(ic2.itc_re_Ticket,0))) Ticket
FROM piz_caixa cai WITH(NOLOCK)
INNER JOIN piz_usuario usu WITH(NOLOCK)
ON cai.usu_in_codigo = usu.usu_in_codigo
LEFT JOIN piz_ItemCaixa ic1 WITH(NOLOCK)
ON ic1.cai_in_codigo = cai.cai_in_codigo
AND LEFT(ic1.itc_st_Natureza,1) = [ô]C[ô]
LEFT JOIN piz_ItemCaixa ic2 WITH(NOLOCK)
ON ic2.cai_in_codigo = cai.cai_in_codigo
AND LEFT(ic2.itc_st_Natureza,1) = [ô]D[ô]
WHERE cai.cai_dt_abertura BETWEEN @pData1 AND @pData2
GROUP BY usu.usu_st_login, cai.cai_dt_abertura, cai.cai_dt_fechamento
ORDER BY usu.usu_st_login, cai.cai_dt_abertura, cai.cai_dt_fechamento


Se estiver tudo OK, não esquece de fechar o tópico e pontuar, se achou que a ajuda foi de valia.

Abraços,
GUSTAVOCANALLI 14/10/2009 00:45:04
#325241
Opa. Logico que a ajuda foi válida.
O ponto já é seu.
Mas esse ultimo script tá com um probleminha. Não é de sintaxe, é que ele está dando erro ao converter o datetime em caracteres.
Dá essa msg de erro quando tenta substituir:

Erro de conversão ao converter datetime da seqüência de caracteres.
RCMRO 14/10/2009 15:13:01
#325307
Troca só o CASE:

            CASE
WHEN CONVERT(CHAR(8),cai.cai_dt_fechamento,112) = [ô]19001010[ô]
THEN [ô]EM ABERTO [ô]
ELSE CONVERT(CHAR(10), cai.cai_dt_fechamento, 103)
END AS cai_dt_fechamento,


Isso deve resolver.

Só mais uma coisa: quando você chamar esta proce, a @pData1 deve ser com a data [Ô]dd/mm/aaaa 00:00:00[Ô] e a @pData2 deve ser [Ô]dd/mm/yyyy 23:59:59[Ô] pois para você garantir que realmente estará entre as datas precisa informar na data final a hora/minuto/segundo do fim do dia.
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas