[FireDAC][Phys][SQLite] ERROR: UNIQUE constraint failed - AJUDEM PORFAVOOOR!!

Android

PostgreSQL

Delphi

SQLite

22/11/2017

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

Henrique Nascimento

Curtidas 0

Respostas

Rafael Bosco

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.
GOSTEI 0
Henrique Nascimento

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

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"?
GOSTEI 0
Henrique Nascimento

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
POSTAR