Erro instrução SQL

17/06/2024

0

Prezados,
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

Responder

Post mais votado

07/07/2024

Prezados,
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
Responder

Mais Posts

08/07/2024

Arthur Heinrich

Muitas coisas podem estar ocorrendo.

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

09/07/2024

Mauricio Bomfim

Prezado Arthur,
Eu estou utilizando o banco SQLite , esse banco aceita essas instruções?
Responder

10/07/2024

Arthur Heinrich

Eu acho que não dá para executar dois updates em sequência na mesma execução, mas posso estar errado.
Experimente rodar um por vez, sem o ponto e vírgula final.
Responder

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

Aceitar