Ajuda com tabela - Copiar registro de tabela

05/05/2021

0

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

Responder

Post mais votado

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;

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

05/05/2021

Huemersonfmg

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;
Responder

05/05/2021

Huemersonfmg

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]
Responder

05/05/2021

Huemersonfmg

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]
Responder

05/05/2021

Emerson Nascimento

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.
Responder

06/05/2021

Huemersonfmg

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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar