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

22/11/2017

0

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

Responder

Posts

23/11/2017

Rafael Bosco

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

24/11/2017

Henrique Nascimento

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
Responder

24/11/2017

Raffael Mendonça

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

24/11/2017

Henrique Nascimento

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

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

Aceitar