Erro instrução SQL
17/06/2024
0
Fiz uma instrução sql para inserir dados na tabela balancopatrimonial das tabelas Lancamentos, lancamentosItens e PlanoContas, a seguir, mas o relatório aparece vazio. Alguem pode me ajudar a descobrir o erro:
Instrução SQL:CódigoDelphi:
procedure TPageBalanco.AtualizarBalancoPatrimonial;
begin
DMRelBalanco.qryBalanco.SQL.Text :=
'UPDATE BalancoPatrimonial SET TotalAtivo = (' +
' SELECT SUM(Lancamentoitens.valortotal)' +
' FROM Lancamentoitens' +
' JOIN Lancamento ON Lancamentoitens.Codigo_Lancamento = Lancamento.CODIGOL' +
' WHERE Lancamentoitens.Codigo_Conta BETWEEN 100 AND 703' +
' AND BalancoPatrimonial.Ano = strftime(''%Y'', Lancamento.dataemissao)' +
');' +
'UPDATE BalancoPatrimonial SET TotalPassivo = (' +
' SELECT SUM(Lancamentoitens.valortotal)' +
' FROM Lancamentoitens' +
' JOIN Lancamento ON Lancamentoitens.Codigo_Lancamento = Lancamento.CODIGOL' +
' WHERE Lancamentoitens.Codigo_Conta BETWEEN 800 AND 810' +
' AND BalancoPatrimonial.Ano = strftime(''%Y'', Lancamento.dataemissao)' +
');' +
'UPDATE BalancoPatrimonial SET PatrimonioLiquido = TotalAtivo - TotalPassivo;';
DMRelBalanco.qryBalanco.ExecSQL;
end;
procedure TPageBalanco.Button1Click(Sender: TObject);
begin
// AtualizarBalancoPatrimonial;
// Chama o relatório (Ainda não implementado)
var
lBalanco := TRelBalanco.Create(nil);
try
lBalanco.Preview;
finally
lBalanco.Free;
end;
AtualizarBalancoPatrimonial;
end;
Tabelas
CREATE TABLE Lancamento (
CODIGOL INTEGER PRIMARY KEY AUTOINCREMENT,
CPFCNPJ VARCHAR (18) REFERENCES Pessoa (CPFCNPJ) ON DELETE CASCADE
ON UPDATE CASCADE
NOT NULL,
Tipo CHAR (1),
dataemissao DATE DEFAULT CURRENT_DATE
NOT NULL
);
CREATE TABLE Lancamentoitens (
CodigoI INTEGER PRIMARY KEY AUTOINCREMENT,
Codigo_Lancamento INTEGER REFERENCES Lancamento (CODIGOL) ON DELETE CASCADE
ON UPDATE CASCADE,
Codigo_Produto INTEGER REFERENCES produto (CODIGO)
NOT NULL,
Codigo_Atividade INTEGER REFERENCES Atividade (CODIGO)
NOT NULL,
Codigo_Conta INTEGER REFERENCES PlanoContas (CodigoConta)
NOT NULL,
quantidade INTEGER NOT NULL,
valorunitario DECIMAL (17, 2) NOT NULL,
valortotal DECIMAL (17, 2)
);
CREATE TABLE PlanoContas (
CodigoConta INTEGER PRIMARY KEY
NOT NULL,
NomeConta VARCHAR (30) NOT NULL,
TipoConta CHAR (1) NOT NULL
);
CREATE TABLE BalancoPatrimonial (
CODIGO INTEGER PRIMARY KEY AUTOINCREMENT,
Ano INTEGER NOT NULL,
CODIGO_CONTA INTEGER REFERENCES PlanoContas (CodigoConta),
TotalPassivo DECIMAL (10, 2),
TotalAtivo DECIMAL (10, 2),
PatrimonioLiquido DECIMAL (10, 2)
);
![Mauricio Bomfim Mauricio Bomfim](https://www.devmedia.com.br/imagens/fotoscolunistas/150517_20211015060923.jpg)
Mauricio Bomfim
Post mais votado
07/07/2024
Fiz uma instrução sql para inserir dados na tabela balancopatrimonial das tabelas Lancamentos, lancamentosItens e PlanoContas, a seguir, mas o relatório aparece vazio. Alguem pode me ajudar a descobrir o erro:
Instrução SQL:CódigoDelphi:
procedure TPageBalanco.AtualizarBalancoPatrimonial;
begin
DMRelBalanco.qryBalanco.SQL.Text :=
'UPDATE BalancoPatrimonial SET TotalAtivo = (' +
' SELECT SUM(Lancamentoitens.valortotal)' +
' FROM Lancamentoitens' +
' JOIN Lancamento ON Lancamentoitens.Codigo_Lancamento = Lancamento.CODIGOL' +
' WHERE Lancamentoitens.Codigo_Conta BETWEEN 100 AND 703' +
' AND BalancoPatrimonial.Ano = strftime(''%Y'', Lancamento.dataemissao)' +
');' +
'UPDATE BalancoPatrimonial SET TotalPassivo = (' +
' SELECT SUM(Lancamentoitens.valortotal)' +
' FROM Lancamentoitens' +
' JOIN Lancamento ON Lancamentoitens.Codigo_Lancamento = Lancamento.CODIGOL' +
' WHERE Lancamentoitens.Codigo_Conta BETWEEN 800 AND 810' +
' AND BalancoPatrimonial.Ano = strftime(''%Y'', Lancamento.dataemissao)' +
');' +
'UPDATE BalancoPatrimonial SET PatrimonioLiquido = TotalAtivo - TotalPassivo;';
DMRelBalanco.qryBalanco.ExecSQL;
end;
procedure TPageBalanco.Button1Click(Sender: TObject);
begin
// AtualizarBalancoPatrimonial;
// Chama o relatório (Ainda não implementado)
var
lBalanco := TRelBalanco.Create(nil);
try
lBalanco.Preview;
finally
lBalanco.Free;
end;
AtualizarBalancoPatrimonial;
end;
Tabelas
CREATE TABLE Lancamento (
CODIGOL INTEGER PRIMARY KEY AUTOINCREMENT,
CPFCNPJ VARCHAR (18) REFERENCES Pessoa (CPFCNPJ) ON DELETE CASCADE
ON UPDATE CASCADE
NOT NULL,
Tipo CHAR (1),
dataemissao DATE DEFAULT CURRENT_DATE
NOT NULL
);
CREATE TABLE Lancamentoitens (
CodigoI INTEGER PRIMARY KEY AUTOINCREMENT,
Codigo_Lancamento INTEGER REFERENCES Lancamento (CODIGOL) ON DELETE CASCADE
ON UPDATE CASCADE,
Codigo_Produto INTEGER REFERENCES produto (CODIGO)
NOT NULL,
Codigo_Atividade INTEGER REFERENCES Atividade (CODIGO)
NOT NULL,
Codigo_Conta INTEGER REFERENCES PlanoContas (CodigoConta)
NOT NULL,
quantidade INTEGER NOT NULL,
valorunitario DECIMAL (17, 2) NOT NULL,
valortotal DECIMAL (17, 2)
);
CREATE TABLE PlanoContas (
CodigoConta INTEGER PRIMARY KEY
NOT NULL,
NomeConta VARCHAR (30) NOT NULL,
TipoConta CHAR (1) NOT NULL
);
CREATE TABLE BalancoPatrimonial (
CODIGO INTEGER PRIMARY KEY AUTOINCREMENT,
Ano INTEGER NOT NULL,
CODIGO_CONTA INTEGER REFERENCES PlanoContas (CodigoConta),
TotalPassivo DECIMAL (10, 2),
TotalAtivo DECIMAL (10, 2),
PatrimonioLiquido DECIMAL (10, 2)
);
Já tentou rodar essa cosulta no flamerobin?
Assis Ferreira
![Assis Ferreira](https://www.devmedia.com.br/imagens/fotoscolunistas/avatar/avatar-3.png)
Mais Posts
08/07/2024
Arthur Heinrich
Quando você faz o update na tabela BalancoPatrimonial, não existe uma cláusula WHERE. Então, a menos que a tabela só possua uma linha, seu update vai alterar todas as linhas.
Além disso, está utilizando uma query para executar múltiplos comandos, de uma só vez. Nem todos os bancos aceitam isso.
No Oracle, por exemplo, o SQL não reconhece o símbolo ";" para separar comandos. Executar: comando1;comando2;... acarreta um erro.
Para funcionar, tem que transformar em um bloco PL/SQL anônimo, executando: begin comando1;comando2;... end;
Sua rotina também não executa um commit que, dependendo do banco, não é automático. Se você atualiza em uma sessão, sem commit, e acessa os dados em outra sessão, as alterações não são visíveis.
Além disso, a rotina que executa os updates está sendo executada depois do preview do relatório. Portanto, não há como o preview exibir o que ainda não foi atualizado.
Pode ser que isto não se aplique ao seu caso, mas são muitos detalhes que podem acarretar a falha.
09/07/2024
Mauricio Bomfim
Eu estou utilizando o banco SQLite , esse banco aceita essas instruções?
10/07/2024
Arthur Heinrich
Experimente rodar um por vez, sem o ponto e vírgula final.
Clique aqui para fazer login e interagir na Comunidade :)