Ir para conteúdo
Fórum CódigoFonte.net

Igna

Membros
  • Total de itens

    1
  • Registro em

  • Última visita

  1. Igna

    Erro

    Ola malta, estou a fazer um mini programa que passa os dados de uma base de dados sql server para uma base de dados access, o objectivo e inserir os dados de tres das tabela do sql server(artigos,preco,precocusto) na tabela access, se o artigo ja existir este deve actualizar. Aqui deixo o codigo e mais a baixo o erro procedure TForm10.BEnviarClick(Sender: TObject); Var TextoSQL,TempPreco,d,descr,TempPrecoCusto,Preco,PrecoCusto : String; Flag : Boolean; I: Integer; begin // Colocar o JOIN no primeiro registo DataModule1.join.First; //Fazer ciclo While para percorrer todos os registos do JOIN while (not datamodule1.Join.Eof) do begin //Dentro do ciclo procurar o artigo na tabela do Access [Vou fazer esta parte do código por que é mais complicada] Datamodule1.Taccess.IndexFieldNames:='codigo'; //Activa o indice porcódigo para ser mais rápida a pesquisa if Datamodule1.Taccess.Locate('codigo',Datamodule1.Join.FieldByName('StrCodigo').asstring,[]) then //Procura o código begin //se encontrou o artigo na tabela Access deve actualizar o registo ou não ????? DataModule1.TacCess.edit; //COPIAR DADOS E POST Begin // Retirar Aspas da descrição dos artigos d := DataModule1.Join['STRDescricao']; for I := 1 to Length(d) do Begin if d[i] <> '"' then if i=1 then descr:=d[i] Else descr:=descr+d[i]; End; // Substituir as virgulas por pontos do Preço TempPreco:= FloatToStr(DataModule1.Join['FLTPreco']); For I := 1 to Length(TempPreco) do If TempPreco[i] = ',' then Preco := Preco + '.' Else If I=1 then Preco := TempPreco[i] Else Preco := Preco + TempPreco[i]; // Substituir as virgulas por pontos do Preço Custo TempPrecoCusto := FloatToStr(DataModule1.Join['FLTPCUltimo']); For I := 1 to Length(TempPrecoCusto) do If TempPrecoCusto[i] = ',' then PrecoCusto := PrecoCusto + '.' Else If I=1 then PrecoCusto := TempPrecoCusto[i] Else PrecoCusto := PrecoCusto + TempPrecoCusto[i]; //Inserir o Registo na Tabela Access Datamodule1.Taccess.Insert; Datamodule1.Taccess.fieldbyname('codigo').AsString:= Datamodule1.Join.FieldByName('StrCodigo').asstring; Datamodule1.Taccess.fieldbyname('desc').AsString:= descr+' '+precocusto+' '+preco; // Datamodule1.Taccess.fieldbyname('id_familia').AsString:= Datamodule1.Join.FieldByName('Strid_familia').asstring; Datamodule1.Taccess.fieldbyname('preco1').AsString:= Datamodule1.Join.FieldByName('fltpreco').asstring; Datamodule1.Taccess.fieldbyname('pcusto').AsString:= Datamodule1.Join.FieldByName('fltpcultimo').asstring; Datamodule1.Taccess.fieldbyname('iva').AsString:= Datamodule1.Join.FieldByName('intTpIva').asstring; //acaba aqui de preencher os restantes campos //Datamodule1.Taccess.fieldbyname('desc').AsString:= //Gravar o registo Datamodule1.Taccess.Post; end; end else // se NÃO encontrou o o artigo na tabela Access insere-o DataModule1.Tartigos.insert; begin //Fazer aquilo que está a ser feito no outro botão, retirar aspas, substituir virgulas por pontos, etc Begin // Retirar Aspas da descrição dos artigos d := DataModule1.Join['STRDescricao']; for I := 1 to Length(d) do Begin if d[i] <> '"' then if i=1 then descr:=d[i] Else descr:=descr+d[i]; End; // Substituir as virgulas por pontos do Preço TempPreco:= FloatToStr(DataModule1.Join['FLTPreco']); For I := 1 to Length(TempPreco) do If TempPreco[i] = ',' then Preco := Preco + '.' Else If I=1 then Preco := TempPreco[i] Else Preco := Preco + TempPreco[i]; // Substituir as virgulas por pontos do Preço Custo TempPrecoCusto := FloatToStr(DataModule1.Join['FLTPCUltimo']); For I := 1 to Length(TempPrecoCusto) do If TempPrecoCusto[i] = ',' then PrecoCusto := PrecoCusto + '.' Else If I=1 then PrecoCusto := TempPrecoCusto[i] Else PrecoCusto := PrecoCusto + TempPrecoCusto[i]; //Inserir o Registo na Tabela Access Datamodule1.Taccess.Insert; Datamodule1.Taccess.fieldbyname('codigo').AsString:= Datamodule1.Join.FieldByName('StrCodigo').asstring; Datamodule1.Taccess.fieldbyname('desc').AsString:= descr+' '+precocusto+' '+preco; //Datamodule1.Taccess.fieldbyname('id_familia').AsString:= Datamodule1.Join.FieldByName('Strid_familia').asstring; Datamodule1.Taccess.fieldbyname('preco1').AsString:= Datamodule1.Join.FieldByName('fltpreco').asstring; Datamodule1.Taccess.fieldbyname('pcusto').AsString:= Datamodule1.Join.FieldByName('fltpcultimo').asstring; Datamodule1.Taccess.fieldbyname('iva').AsString:= Datamodule1.Join.FieldByName('intTpIva').asstring; //acaba aqui de preencher os restantes campos //Datamodule1.Taccess.fieldbyname('desc').AsString:= //Gravar o registo Datamodule1.Taccess.Post; end; // Avançar para o proximo registo do JOIN DataModule1.join.next; end; end; end; O erro que me dá e este "As alterações pedidas para a tabela não foram bem sucedidas, pois iriam criar valores duplicados no indice, na tecla primaria, ou no relacionamento. altere os dados do campo ou os campos que contem os dados duplicados, remova ou indice ou volte a definir o indice para que as entradas possam ser duplicadas e tente de novo" Alguem me dá uma ajuda?
×
×
  • Criar Novo...