[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