Ajuda com tabela - Copiar registro de tabela
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
Post 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
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;
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]
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]
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;
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.
Clique aqui para fazer login e interagir na Comunidade :)