PROBLEMA COM INSTRUCAO SQL
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!
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!
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.
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
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!
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!
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
Entao cara.
Deu quase certo, mas ele não está fazendo os calculos. Ele está ignorando os valores cadastrado como débito
Deu quase certo, mas ele não está fazendo os calculos. Ele está ignorando os valores cadastrado como débito
Para evitar problemas com palavras escritas de forma diferente, substitui as linhas:
e
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.
AND ic1.itc_st_Natureza = [ô]CRéDITO[ô]
porAND LEFT(ic1.itc_st_Natureza,1) = [ô]C[ô]
e
AND ic2.itc_st_Natureza = [ô]DéBITO[ô]
porAND 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.
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:
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
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
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
Ai vai como:
Se estiver tudo OK, não esquece de fechar o tópico e pontuar, se achou que a ajuda foi de valia.
Abraços,
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,
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.
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.
Troca só o CASE:
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.
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.
Tópico encerrado , respostas não são mais permitidas