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

22/11/2017

27

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á !!
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
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
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
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. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar