Erro instrução SQL

Delphi

17/06/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)
);
Mauricio Bomfim

Mauricio Bomfim

Curtidas 0

Melhor post

Assis Ferreira

Assis Ferreira

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?
GOSTEI 1

Mais Respostas

Arthur Heinrich

Arthur Heinrich

17/06/2024

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.
GOSTEI 0
Mauricio Bomfim

Mauricio Bomfim

17/06/2024

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

Arthur Heinrich

17/06/2024

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.
GOSTEI 0
POSTAR