Ajuda com tabela - Copiar registro de tabela

CRUD - Delphi

05/05/2021

Bom dia.
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

Huemersonfmg

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

05/05/2021

uma vez que o método Append é executado, um registro em branco é criado.
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 1

Mais Respostas

Huemersonfmg

Huemersonfmg

05/05/2021

uma vez que o método Append é executado, um registro em branco é criado.
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
Huemersonfmg

Huemersonfmg

05/05/2021

uma vez que o método Append é executado, um registro em branco é criado.
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;

Boa noite, obrigado por retornar tão rápido.
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
Huemersonfmg

Huemersonfmg

05/05/2021

uma vez que o método Append é executado, um registro em branco é criado.
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;

Boa noite, obrigado por retornar tão rápido.
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
Emerson Nascimento

Emerson Nascimento

05/05/2021

tente assim:
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;
se ainda assim não funcionar, basta debugar que você vai encontrar a solução.
GOSTEI 1
Huemersonfmg

Huemersonfmg

05/05/2021

Bom dia.
Muito obrigado por seu retorno.
O código ficou perfeito, atendendo exatamente a minha necessidade, agora preciso fazer alguns ajustes para finalizar.
GOSTEI 0
POSTAR