Erro quando vou Inserir\\Salvar um registro

22/05/2024

0

Erro ao salvar registro.

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

Mauricio Bomfim

Responder

Posts

22/05/2024

Alberto

PARAMETER {CODIGO_COMPRA] DATA TYPE IS UNKNOW
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.
Responder

22/05/2024

Mauricio Bomfim

PARAMETER {CODIGO_COMPRA] DATA TYPE IS UNKNOW
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????
Responder

22/05/2024

Alberto

Olhando o código talvez voce tenha que trocar isso:
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.
Responder

22/05/2024

Mauricio Bomfim

Olhando o código talvez voce tenha que trocar isso:
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"????
Responder

25/05/2024

Mauricio Bomfim


Fiz a alteração, mas o erro continua. Alguém pode me ajudar???




Olhando o código talvez voce tenha que trocar isso:
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"????
Responder

30/05/2024

Mauricio Bomfim

ME AJUDA AÌ, GENTE, POR FAVOR.
Fiz a alteração, mas o erro continua. Alguém pode me ajudar???




Olhando o código talvez voce tenha que trocar isso:
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"????
Responder

31/05/2024

Arthur Heinrich

Eu acredito que a inserção da compra esteja correta:

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

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

Eu acredito que a inserção da compra esteja correta:

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

17/06/2024

Mauricio Bomfim

RESOLVIDO ------------------------------------------
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?????

Eu acredito que a inserção da compra esteja correta:

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

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

Aceitar