Erro quando vou Inserir\\Salvar um registro
22/05/2024
0
Prezados,
Quando tento incluir um registro em meu Form,
Aparece a mensagem de erro abaixo:
"ERRO FIREDAC-SQLITE: 335.PARAMETER {CODIGO_COMPRA]
DATA TYPE IS UNKNOW.HINT: SPECIFY TFDPARAM.DATATYPE
OR ASSIGN TFDPARAM VALUEBEFORE PREPARE\EXECUTE CALL."
Tenho o procedimento para InserirRegistro que está
ocasionando um erro quando vou salvar o registro,
referente ao campo CODIGO_COMPRA da Tabela CompraItens
que esta ligado ao Campo Codigo da Tabela Compras.
Estou utilizando o padrão MVC com interfaces.
Seguem as tabelas e o código completo .
ALGUÉM PODE ME AJUDAR????AGRADEÇO ANTECIPADAMENTE.
=x=x=x=x=x=x==x=x=x=x=x==x=x=x=x=x==x=x=x=x=x==x=x=x=x=x==x=x
CREATE TABLE compra (
CODIGO INTEGER PRIMARY KEY AUTOINCREMENT,
CPFCNPJ VARCHAR (18) REFERENCES Pessoa (CPFCNPJ) ON DELETE CASCADE
ON UPDATE CASCADE
NOT NULL,
dataemissao DATE DEFAULT CURRENT_DATE
NOT NULL,
valortotal DECIMAL (17, 2)
);
x==x=x=x=x=x=x=x=x==x=x=x=x=x=x=x==x=x=x=x=x=x==x=x=x=x=x=x==x=x
CREATE TABLE compraitens (
Codigo INTEGER PRIMARY KEY AUTOINCREMENT,
Codigo_Compra INTEGER REFERENCES compra (CODIGO) 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)
);
=x=x=x==x=x=x=x==x=x=x=x=x=x=x=x=x==x=x=x=x=x=x=x==x=x=x=x=x=x==x=x=x=x=x=x=x=x==x=x=x=
procedure TPageCompras.InserirRegistro;
var
NewCompraID: Integer;
begin
ShowMessage('Iniciando inserção de registro.');
TUtilitarios.VerificaCampoVazio(edtCPFCNPJ, 'CPF ou CNPJ');
TUtilitarios.VerificaCampoVazio(edtCodigoProduto, 'Código do Produto');
TUtilitarios.VerificaCampoVazio(edtQuantidade, 'Quantidade');
TUtilitarios.VerificaCampoVazio(edtValorUnitario, 'Valor Unitário');
TUtilitarios.VerificaCampoVazio(edtCodigoAtividade, 'Código da Atividade');
TUtilitarios.VerificaCampoVazio(edtCodigo_Conta, 'Código da Conta');
TUtilitarios.VerificaCampoVazio(edtDataCompra, 'Data da Compra');
try
ShowMessage('Verificações de campo concluídas. Inserindo compra...');
with FController.Compra do
begin
CPFCNPJ(edtCPFCNPJ.Text);
DATAEMISSAO(edtDataCompra.Date);
VALORTOTAL(StrToCurrDef(edtValorTotal.Text, 0.00));
Build.Inserir;
NewCompraID := CODIGO;
ShowMessage('Compra inserida com sucesso. ID: ' + IntToStr(NewCompraID));
end;
ShowMessage('Inserindo itens da compra...');
//////ERRO A PARTIR DAQUI
with FController.CompraItens do
begin
CODIGO_COMPRA(NewCompraID);
CODIGO_PRODUTO(StrToInt(edtCodigoProduto.Text));
CODIGO_ATIVIDADE(StrToInt(edtCodigoAtividade.Text));
CODIGO_CONTA(StrToInt(edtCodigo_Conta.Text));
QUANTIDADE(StrToInt(edtQuantidade.Text));
VALORUNITARIO(StrToCurrDef(edtValorUnitario.Text, 0.00));
VALORTOTAL(StrToCurrDef(edtValorTotal.Text, 0.00));
Build.Inserir;
ShowMessage('Itens da compra inseridos com sucesso.');
end;
ShowMessage('Compra cadastrada com sucesso!');
except
on E: Exception do
begin
ShowMessage('Erro ao tentar cadastrar a compra: ' + E.Message);
raise;
end;
end;
end;
procedure TPageCompras.btnSalvarClick(Sender: TObject);
begin
inherited;
try
//Erro nesse metódo (Provavelmente)
InserirRegistro;
except
on E: EDatabaseError do
if Pos('unique constraint', E.Message) > 0 then
ShowMessage('Erro: Código da compra já existe!')
else
ShowMessage('Erro de banco de dados: ' + E.Message);
on E: Exception do
ShowMessage('Erro geral: ' + E.Message);
end;
end;
Mauricio Bomfim
Posts
22/05/2024
Alberto
O parâmetro CODIGO_COMPRA está como tipo desconhecido.
Verifique onde você executa a expressão SQL e antes de executa-la
verifique se você está definindo o tipo do parâmetro.
22/05/2024
Mauricio Bomfim
O parâmetro CODIGO_COMPRA está como tipo desconhecido.
Verifique onde você executa a expressão SQL e antes de executa-la
verifique se você está definindo o tipo do parâmetro.
Eu criei uma variável Tipo Integer "NewCompraID" que recebe
o valor do campo CODIGO DA TABELA COMPRA E DEPOIS
REPASSA O VALOR PARA O CAMPO CODIGO_COMPRA
DA TABELA COMPRAITENS. Não está correto?
Eu utilizo interfaces e não tenho instrução SQL
no formulário. Pode me ajudar????
22/05/2024
Alberto
Build.Inserir;
NewCompraID := CODIGO;
por isso:
NewCompraID := CODIGO;
Build.Inserir;
Pode ser que o erro não seja o tipo do parametro, mas o valor do parametro.
22/05/2024
Mauricio Bomfim
Build.Inserir;
NewCompraID := CODIGO;
por isso:
NewCompraID := CODIGO;
Build.Inserir;
Pode ser que o erro não seja o tipo do parametro, mas o valor do parametro.
Fiz essa alteração, mas o erro continua o mesmo. Pode me dar outra "Luz"????
25/05/2024
Mauricio Bomfim
Fiz a alteração, mas o erro continua. Alguém pode me ajudar???
Build.Inserir;
NewCompraID := CODIGO;
por isso:
NewCompraID := CODIGO;
Build.Inserir;
Pode ser que o erro não seja o tipo do parametro, mas o valor do parametro.
Fiz essa alteração, mas o erro continua o mesmo. Pode me dar outra "Luz"????
30/05/2024
Mauricio Bomfim
Fiz a alteração, mas o erro continua. Alguém pode me ajudar???
Build.Inserir;
NewCompraID := CODIGO;
por isso:
NewCompraID := CODIGO;
Build.Inserir;
Pode ser que o erro não seja o tipo do parametro, mas o valor do parametro.
Fiz essa alteração, mas o erro continua o mesmo. Pode me dar outra "Luz"????
31/05/2024
Arthur Heinrich
with FController.Compra do begin CPFCNPJ(edtCPFCNPJ.Text); DATAEMISSAO(edtDataCompra.Date); VALORTOTAL(StrToCurrDef(edtValorTotal.Text, 0.00)); Build.Inserir; NewCompraID := CODIGO; ShowMessage('Compra inserida com sucesso. ID: ' + IntToStr(NewCompraID)); end;
No código acima, são preenchidas as 3 colunas que não são preenchidas automaticamente.
Ao sair do método Build.Inserir, é esperado que a coluna CODIGO (PK da tabela), tenha sido atualizada com o valor inserido (automaticamente).
A atribuição do valor da coluna CODIGO à variável NewCompraID serve para preservar esse valor fora co contexto da classe Compra.
O ShowMessage() deveria estar mostrando o ID inserido na tabela corretamente.
with FController.CompraItens do begin CODIGO_COMPRA(NewCompraID); CODIGO_PRODUTO(StrToInt(edtCodigoProduto.Text)); CODIGO_ATIVIDADE(StrToInt(edtCodigoAtividade.Text)); CODIGO_CONTA(StrToInt(edtCodigo_Conta.Text)); QUANTIDADE(StrToInt(edtQuantidade.Text)); VALORUNITARIO(StrToCurrDef(edtValorUnitario.Text, 0.00)); VALORTOTAL(StrToCurrDef(edtValorTotal.Text, 0.00)); Build.Inserir; ShowMessage('Itens da compra inseridos com sucesso.'); end;
A inserção na tabela CompraItens também parece OK.
Você está inserindo o ID da compra, na coluna CODIGO_COMPRA (FK), com a instrução: CODIGO_COMPRA(NewCompraID);
Internamente, este método CODIGO_COMPRA() precisa atribuir o valor passado para um parâmetro na query que será executada pelo método Build.Inserir.
É neste ponto que o tipo do parâmetro deveria ser setado. O fato da variável NewCompraID ser do tipo Integer não é garantia de que o parâmetro da query seja deste mesmo tipo.
Se você atribui o valor do parâmetro com "Parametro.AsInteger:=<valor>;", muito provavelmente o parâmetro é tratado como "INT".
Porém, o parâmetro pode ser atribuído como: "Parametro.Value:=<valor>;". Neste caso, a propriedade Value não possui um tipo definido e não vai setar o tipo do parâmetro automaticamente. O tipo precisa ser definido explicitamente.
Você terá que checar o método para ver como o valor é atribuído e corrigir o código, se estiver incorreto ou incompleto..
31/05/2024
Mauricio Bomfim
Então, meu parametro value aponta para integer, conforme abaixo:
iCompraItens = interface
function CodigoI(Value: Integer): iCompraItens; overload;
function CodigoI: Integer; overload;
function Codigo_Compra(Value: Integer): iCompraItens; overload;
function Codigo_Compra: Integer; overload;
function Codigo_Produto(Value: Integer): iCompraItens; overload;
function Codigo_Produto: Integer; overload;
function Codigo_Atividade(Value: Integer): iCompraItens; overload;
function Codigo_Atividade: Integer; overload;
function Codigo_Conta(Value: Integer): iCompraItens; overload;
function Codigo_Conta: Integer; overload;
function Quantidade(Value: Integer): iCompraItens; overload;
function Quantidade: Integer; overload;
function ValorUnitario(Value: Currency): iCompraItens; overload;
function ValorUnitario: Currency; overload;
function ValorTotal(Value: Currency): iCompraItens; overload;
function ValorTotal: Currency; overload;
function Build: iService<TCompraItens>;
end;
Pode verificar?????
with FController.Compra do begin CPFCNPJ(edtCPFCNPJ.Text); DATAEMISSAO(edtDataCompra.Date); VALORTOTAL(StrToCurrDef(edtValorTotal.Text, 0.00)); Build.Inserir; NewCompraID := CODIGO; ShowMessage('Compra inserida com sucesso. ID: ' + IntToStr(NewCompraID)); end;
No código acima, são preenchidas as 3 colunas que não são preenchidas automaticamente.
Ao sair do método Build.Inserir, é esperado que a coluna CODIGO (PK da tabela), tenha sido atualizada com o valor inserido (automaticamente).
A atribuição do valor da coluna CODIGO à variável NewCompraID serve para preservar esse valor fora co contexto da classe Compra.
O ShowMessage() deveria estar mostrando o ID inserido na tabela corretamente.
with FController.CompraItens do begin CODIGO_COMPRA(NewCompraID); CODIGO_PRODUTO(StrToInt(edtCodigoProduto.Text)); CODIGO_ATIVIDADE(StrToInt(edtCodigoAtividade.Text)); CODIGO_CONTA(StrToInt(edtCodigo_Conta.Text)); QUANTIDADE(StrToInt(edtQuantidade.Text)); VALORUNITARIO(StrToCurrDef(edtValorUnitario.Text, 0.00)); VALORTOTAL(StrToCurrDef(edtValorTotal.Text, 0.00)); Build.Inserir; ShowMessage('Itens da compra inseridos com sucesso.'); end;
A inserção na tabela CompraItens também parece OK.
Você está inserindo o ID da compra, na coluna CODIGO_COMPRA (FK), com a instrução: CODIGO_COMPRA(NewCompraID);
Internamente, este método CODIGO_COMPRA() precisa atribuir o valor passado para um parâmetro na query que será executada pelo método Build.Inserir.
É neste ponto que o tipo do parâmetro deveria ser setado. O fato da variável NewCompraID ser do tipo Integer não é garantia de que o parâmetro da query seja deste mesmo tipo.
Se você atribui o valor do parâmetro com "Parametro.AsInteger:=<valor>;", muito provavelmente o parâmetro é tratado como "INT".
Porém, o parâmetro pode ser atribuído como: "Parametro.Value:=<valor>;". Neste caso, a propriedade Value não possui um tipo definido e não vai setar o tipo do parâmetro automaticamente. O tipo precisa ser definido explicitamente.
Você terá que checar o método para ver como o valor é atribuído e corrigir o código, se estiver incorreto ou incompleto..
17/06/2024
Mauricio Bomfim
Então, meu parametro value aponta para integer, conforme abaixo:
iCompraItens = interface
function CodigoI(Value: Integer): iCompraItens; overload;
function CodigoI: Integer; overload;
function Codigo_Compra(Value: Integer): iCompraItens; overload;
function Codigo_Compra: Integer; overload;
function Codigo_Produto(Value: Integer): iCompraItens; overload;
function Codigo_Produto: Integer; overload;
function Codigo_Atividade(Value: Integer): iCompraItens; overload;
function Codigo_Atividade: Integer; overload;
function Codigo_Conta(Value: Integer): iCompraItens; overload;
function Codigo_Conta: Integer; overload;
function Quantidade(Value: Integer): iCompraItens; overload;
function Quantidade: Integer; overload;
function ValorUnitario(Value: Currency): iCompraItens; overload;
function ValorUnitario: Currency; overload;
function ValorTotal(Value: Currency): iCompraItens; overload;
function ValorTotal: Currency; overload;
function Build: iService<TCompraItens>;
end;
Pode verificar?????
with FController.Compra do begin CPFCNPJ(edtCPFCNPJ.Text); DATAEMISSAO(edtDataCompra.Date); VALORTOTAL(StrToCurrDef(edtValorTotal.Text, 0.00)); Build.Inserir; NewCompraID := CODIGO; ShowMessage('Compra inserida com sucesso. ID: ' + IntToStr(NewCompraID)); end;
No código acima, são preenchidas as 3 colunas que não são preenchidas automaticamente.
Ao sair do método Build.Inserir, é esperado que a coluna CODIGO (PK da tabela), tenha sido atualizada com o valor inserido (automaticamente).
A atribuição do valor da coluna CODIGO à variável NewCompraID serve para preservar esse valor fora co contexto da classe Compra.
O ShowMessage() deveria estar mostrando o ID inserido na tabela corretamente.
with FController.CompraItens do begin CODIGO_COMPRA(NewCompraID); CODIGO_PRODUTO(StrToInt(edtCodigoProduto.Text)); CODIGO_ATIVIDADE(StrToInt(edtCodigoAtividade.Text)); CODIGO_CONTA(StrToInt(edtCodigo_Conta.Text)); QUANTIDADE(StrToInt(edtQuantidade.Text)); VALORUNITARIO(StrToCurrDef(edtValorUnitario.Text, 0.00)); VALORTOTAL(StrToCurrDef(edtValorTotal.Text, 0.00)); Build.Inserir; ShowMessage('Itens da compra inseridos com sucesso.'); end;
A inserção na tabela CompraItens também parece OK.
Você está inserindo o ID da compra, na coluna CODIGO_COMPRA (FK), com a instrução: CODIGO_COMPRA(NewCompraID);
Internamente, este método CODIGO_COMPRA() precisa atribuir o valor passado para um parâmetro na query que será executada pelo método Build.Inserir.
É neste ponto que o tipo do parâmetro deveria ser setado. O fato da variável NewCompraID ser do tipo Integer não é garantia de que o parâmetro da query seja deste mesmo tipo.
Se você atribui o valor do parâmetro com "Parametro.AsInteger:=<valor>;", muito provavelmente o parâmetro é tratado como "INT".
Porém, o parâmetro pode ser atribuído como: "Parametro.Value:=<valor>;". Neste caso, a propriedade Value não possui um tipo definido e não vai setar o tipo do parâmetro automaticamente. O tipo precisa ser definido explicitamente.
Você terá que checar o método para ver como o valor é atribuído e corrigir o código, se estiver incorreto ou incompleto..
Clique aqui para fazer login e interagir na Comunidade :)