Fórum Ajuda com tabela - Copiar registro de tabela #615679
05/05/2021
0
Estou criando um App, onde preciso copiar a primeira linha da tabela [n] vezes, os campos serão preenchidos pelo usuário, e depois ele deve clicar no botão [GERAR], e informar quantas linhas deverão ser geradas, o sistema tem que replicar a primeira linha [n] vezes com um [ID - paletes], em acréscimo, e na linha final dar a diferença de cestas por palete.
Estou usando o Delphi 10.3
O Botão [GERAR], ficou assim:
procedure TForm1.Button1Click(Sender: TObject);
var
i,J: Integer;
begin
for I := 2 to StrToInt(Edit1.Text) do
begin
ADOTable1.Append;
for J := 1 to ADOTable1.FieldCount-1 do
begin
case J of
0: continue;//pula o primeiro campo pois e auto incremento;
1: begin
ADOTable1.Fields[J].AsInteger := ADOTable1.Fields[J].AsInteger+I;//Incremento do Tombamento
end
else
ADOTable1.Fields[J].Value := ADOTable1.Fields[J].Value; //Demais campos
ADOTable1.Fields[J].Value := ADOTable1.Fields[J].Value;
end;
end;
ADOTable1.Post;
end;
end;
Mas quando o botão é pressionado ele gera [n] linhas com os números dos paletes em acréscimo mas os outros campos ficam em branco.
Podem me ajudar?
[img]https://i.servimg.com/u/f33/19/92/85/47/scree158.png[/img][/url]
Huemersonfmg
Curtir tópico
+ 0Post mais votado
05/05/2021
dessa forma você está copiando o registro em branco para ele mesmo.
você precisa guardar o conteúdo do registro ANTES de executar o Append.
algo assim:
procedure TForm1.Button1Click(Sender: TObject); var i,J,iTot: Integer; registro: array of variant; begin iTot := StrToIntDef(Edit1.Text,1); // configura o tamanho do array com o número de campos da tabela SetLength(registro, ADOTable1.FieldCount); // grava o conteúdo do registro posicionado, de onde serão feitas as cópias for J := 0 to ADOTable1.FieldCount-1 do registro[J] := ADOTable1.Fields[J].Value; for I := 2 to iTot do begin ADOTable1.Append; // cria um registro em branco for J := 1 to High(registro) do // recupera os valores do array 'registro' if (J = 1) then ADOTable1.Fields[J].AsInteger := registro[J]+I;//Incremento do Tombamento else ADOTable1.Fields[J].Value := registro[J];//Demais campos ADOTable1.Post; end; end;
Emerson Nascimento
Gostei + 1
Mais Posts
05/05/2021
Huemersonfmg
dessa forma você está copiando o registro em branco para ele mesmo.
você precisa guardar o conteúdo do registro ANTES de executar o Append.
algo assim:
procedure TForm1.Button1Click(Sender: TObject); var i,J,iTot: Integer; registro: array of variant; begin iTot := StrToIntDef(Edit1.Text,1); // configura o tamanho do array com o número de campos da tabela SetLength(registro, ADOTable1.FieldCount); // grava o conteúdo do registro posicionado, de onde serão feitas as cópias for J := 0 to ADOTable1.FieldCount-1 do registro[J] := ADOTable1.Fields[J].Value; for I := 2 to iTot do begin ADOTable1.Append; // cria um registro em branco for J := 1 to High(registro) do // recupera os valores do array 'registro' if (J = 1) then ADOTable1.Fields[J].AsInteger := registro[J]+I;//Incremento do Tombamento else ADOTable1.Fields[J].Value := registro[J];//Demais campos ADOTable1.Post; end; end;
Gostei + 0
05/05/2021
Huemersonfmg
dessa forma você está copiando o registro em branco para ele mesmo.
você precisa guardar o conteúdo do registro ANTES de executar o Append.
algo assim:
procedure TForm1.Button1Click(Sender: TObject); var i,J,iTot: Integer; registro: array of variant; begin iTot := StrToIntDef(Edit1.Text,1); // configura o tamanho do array com o número de campos da tabela SetLength(registro, ADOTable1.FieldCount); // grava o conteúdo do registro posicionado, de onde serão feitas as cópias for J := 0 to ADOTable1.FieldCount-1 do registro[J] := ADOTable1.Fields[J].Value; for I := 2 to iTot do begin ADOTable1.Append; // cria um registro em branco for J := 1 to High(registro) do // recupera os valores do array 'registro' if (J = 1) then ADOTable1.Fields[J].AsInteger := registro[J]+I;//Incremento do Tombamento else ADOTable1.Fields[J].Value := registro[J];//Demais campos ADOTable1.Post; end; end;
Eu apliquei o código e estou tendo um erro, não consegui analisar...
[img]https://i33.servimg.com/u/f33/19/92/85/47/scree159.png[/img][/url]
Gostei + 0
05/05/2021
Huemersonfmg
dessa forma você está copiando o registro em branco para ele mesmo.
você precisa guardar o conteúdo do registro ANTES de executar o Append.
algo assim:
procedure TForm1.Button1Click(Sender: TObject); var i,J,iTot: Integer; registro: array of variant; begin iTot := StrToIntDef(Edit1.Text,1); // configura o tamanho do array com o número de campos da tabela SetLength(registro, ADOTable1.FieldCount); // grava o conteúdo do registro posicionado, de onde serão feitas as cópias for J := 0 to ADOTable1.FieldCount-1 do registro[J] := ADOTable1.Fields[J].Value; for I := 2 to iTot do begin ADOTable1.Append; // cria um registro em branco for J := 1 to High(registro) do // recupera os valores do array 'registro' if (J = 1) then ADOTable1.Fields[J].AsInteger := registro[J]+I;//Incremento do Tombamento else ADOTable1.Fields[J].Value := registro[J];//Demais campos ADOTable1.Post; end; end;
Eu apliquei o código e estou tendo um erro, não consegui analisar...
[img]https://i33.servimg.com/u/f33/19/92/85/47/scree159.png[/img][/url]
Opa consegui resolver o problema, era o [;] antes do [Else] parece que o Delphi não aceita.
Mas agora vi um que não conseguir entender, a segunda coluna está ficando em branco...
[img]https://i33.servimg.com/u/f33/19/92/85/47/scree160.png[/img][/url]
Gostei + 0
05/05/2021
Emerson Nascimento
procedure TForm1.Button1Click(Sender: TObject);
var
i,J,iTot,iTomb,iAuto: Integer;
registro: array of variant;
begin
iTot := StrToIntDef(Edit1.Text,1);
// configura o tamanho do array com o número de campos da tabela
SetLength(registro, ADOTable1.FieldCount);
// grava o conteúdo do registro posicionado, de onde serão feitas as cópias
for J := 0 to ADOTable1.FieldCount-1 do
begin
registro[J] := ADOTable1.Fields[J].Value;
if Trim(AnsiUpperCase(ADOTable1.Fields[J].FieldName)) = 'CAMPO_TOMBAMENTO' then
iTomb := J;
if Trim(AnsiUpperCase(ADOTable1.Fields[J].FieldName)) = 'CAMPO_AUTOINCREMENTO' then
iAuto := J;
end;
for I := 2 to iTot do
begin
ADOTable1.Append; // cria um registro em branco
for J := 0 to High(registro) do
if J <> iAuto then // campo autoincrmento não será manipulado
begin
// recupera os valores do array 'registro'
if (J = iTomb) then
ADOTable1.Fields[J].AsInteger := registro[J]+I //Incremento do Tombamento
else
ADOTable1.Fields[J].Value := registro[J];//Demais campos
end;
ADOTable1.Post;
end;
end;Gostei + 1
06/05/2021
Huemersonfmg
Muito obrigado por seu retorno.
O código ficou perfeito, atendendo exatamente a minha necessidade, agora preciso fazer alguns ajustes para finalizar.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)