[FireDAC][Phys][SQLite] ERROR: UNIQUE constraint failed - AJUDEM PORFAVOOOR!!
Olá, estou desenvolvendo um aplicativo Mobile no Delphi Berlin. O app é muito simples, apenas consultar produtos, eu criei um servidor WebBrouker, na qual eu busco dados do Postgres e envio para o SQLite com o uso de memTables. Porém o meu problema está na hora de inserir os dados na tabela do SQLite. Aparece o seguinte erro quando clico no botão sincornizar "[FireDAC][Phys][SQLite] ERROR: UNIQUE constraint failed : PRODUTO.COD" . Ja fiz tudo oque achei na internet, deixei o COD do SQLite como "Primary key autoincrement", a minha tabela mesmo vazia não carrega os dados por conta desse erro. mas estou achando que o problema esta no SQLite, pois esse mesmo código funcionou em outro aplicativo. Preciso entregar esse app em poucos dias, preciso muito da ajuda de alguem. No desespero até criei o app do Zero de novo, porém o erro perciste. Vou deixar o código da Procedure que faz o download dos dados do Postgres...
E aqui a forma na qual criei a database do SQLite
Agradeço desde já !!
procedure TDM.downloadProds;
const
_INSERT =
'INSERT INTO PRODUTO ' +
'( ' +
' COD, ' +
' DESCRICAO, ' +
' COMPLEMENTO, ' +
' VLRAVISTA, ' +
' VLRAPRAZO, ' +
' LOCALIZACAO ' +
') ' +
'VALUES ' +
'( ' +
' :COD, ' +
' :DESCRICAO, ' +
' :COMPLEMENTO, ' +
' :VLRAVISTA, ' +
' :VLRAPRAZO, ' +
' :LOCALIZACAO ' +
'); ';
var
dsProd : TFDJsonDataSets;
iInserts : Integer;
begin
dsProd := CM.ServerMetodosClient.GetProdutos();
Assert(TFDJSONDataSetsReader.GetListCount(dsProd) = 1);
memAux.AppendData(TFDJSONDataSetsReader.GetListValue(dsProd, 0));
iInserts := memAux.RecordCount;
qryAuxiliar.Active := False;
qryAuxiliar.SQL.Clear;
qryAuxiliar.SQL.Text := _INSERT;
qryAuxiliar.Params.ArraySize := iInserts;
while not memAux.EOF do
begin
qryAuxiliar.ParamByName('COD').AsIntegers[memAux.RecNo -1] := memAux.FieldByName ('pcodprod').AsInteger;
qryAuxiliar.ParamByName('DESCRICAO').AsStrings[memAux.RecNo -1] := memAux.FieldByName ('pdescricao').AsString;
qryAuxiliar.ParamByName('COMPLEMENTO').AsStrings[memAux.RecNo -1]:= memAux.FieldByName ('compl').AsString;
qryAuxiliar.ParamByName('VLRAVISTA').AsFloats[memAux.RecNo -1] := memAux.FieldByName ('pprecovenda').AsFloat;
qryAuxiliar.ParamByName('VLRAPRAZO').AsFloats[memAux.RecNo -1] := memAux.FieldByName ('pprecoprazo').AsFloat;
qryAuxiliar.ParamByName('LOCALIZACAO').AsStrings[memAux.RecNo -1]:= memAux.FieldByName ('plocalizacaoprod').AsString;
memAux.Next;
end;
qryAuxiliar.Execute(iInserts, 0);
end;
E aqui a forma na qual criei a database do SQLite
CREATE TABLE [PRODUTO](
[COD] INTEGER PRIMARY KEY AUTOINCREMENT,
[DESCRICAO] VARCHAR(50),
[COMPLEMENTO] VARCHAR(100),
[VLRAVISTA] NUMERIC(15, 3),
[VLRAPRAZO] NUMERIC(15, 2),
[LOCALIZACAO] VARCHAR(10));
Agradeço desde já !!
Henrique Nascimento
Curtidas 0
Respostas
Rafael Bosco
22/11/2017
Meu amigo, você criou o campo COD como INTEGER PRIMARY KEY AUTOINCREMENT, ou seja, deve haver um incrementador para este campo, e você está atribuindo um valor a ele lá no seu WHILE! Sugiro retirar esse campo da SQL de INSERT e deixar que o DB faça o trabalho.
P.S: Não entendo muito bem de SQLite, mas, você está executando o QryAuxiliar.Execute(iInserts, 0) depois do WHILE, eu vi que você colocou um ArraySize da Query pela contagem de registros do seu MemAux, não seria melhor colocar o QryAuxiliar.ExecSQL dentro do seu WHILE e após isso dar o QtyAuxiliar.Next? Apenas uma opinião.
P.S: Não entendo muito bem de SQLite, mas, você está executando o QryAuxiliar.Execute(iInserts, 0) depois do WHILE, eu vi que você colocou um ArraySize da Query pela contagem de registros do seu MemAux, não seria melhor colocar o QryAuxiliar.ExecSQL dentro do seu WHILE e após isso dar o QtyAuxiliar.Next? Apenas uma opinião.
GOSTEI 0
Henrique Nascimento
22/11/2017
Ok, eu parei de inserir o código e deixei autoincrement. O erro saiu porém não está mais trazendo os dados do SQLite
GOSTEI 0
Raffael Mendonça
22/11/2017
Como assim não esta trazendo do SQLite??
1- você confirmou se o INSERT gravou no banco?
2- de que forma você esta "trazendo os dados do SQLite"?
1- você confirmou se o INSERT gravou no banco?
2- de que forma você esta "trazendo os dados do SQLite"?
GOSTEI 0
Henrique Nascimento
22/11/2017
Então, funciona da seguinte forma: Os dados no qual eu preciso estão no Postgres, criei um servidor WeBroker que traz esses dados de la e joga no meu SQLite. E esse "qryAuxiliar.Execute(iInserts, 0);" é quem faz a inserção no SQLite. Ele carrega na memoria todos os dados do Postgre e faz o insert no SQLite. Ai no fim da execução ele nao me retorna erros, simplesmente não carrega os dados.
GOSTEI 0