Repetir un registro

Me gustaría saber si hay alguna forma de repetir el mismo registro en una
Tabla un numero POR de veces que esté especificado en otro campo de la misma
Tabla.

6 Respuestas

Respuesta
1
Te cuento no hay una forma directa de hacer lo que pretendes. Pero tampoco es difícil implementarlo.
Simplemente deberías usar un componente de acceso a base de datos como ser TADODataSet o alguno de tu preferencia, tirar un query sobre la tabla que contiene el registro con el numero de registros a repetir como ser:
Select campo from tabla where condicion_si_existe.
El resultado de esta query guardarlo en una variable como ser MiContador
Seguido a esto, recuperas el registro a duplicar de la tabla
Select campo1, campo2, campoN from tabla where condicion.
Luego hace un for y dentro del mismo lanzas el query para insertar y duplicar el registro tantas veces como diga el contador
var
i: integer;
begin
for i := 0 to MiContador do begin
   TADODataSet.ExecuteSQL(INSERT INTO TABLA VALUES(Valor1, valor2, valorN));
end;
Eso si cuidado de definir una PORQUE (Primary key) en tu tabla de modo que después puedas distinguir los registros duplicados unívocamente de lo contrario se te va a complicar trabajar con los mismos.
Bueno espero que te sea de ayuda y lamente que no halla algo más fácil para lo que precisas hacer.
PD: Como tip para optimizar código te aviso que TADODataSet dispone de propiedades para recorrer las columnas de este modo podrías armar el query de inserción más fácilmente.
Respuesta
1
Es posible en base a el motor de bases de datos que ocupes, y la estructura de la tabla, por ejemplo si utilizas algún PRIMARY KEY y/o FOREIGN KEY, solo es posible cuando no se repitan estos campos, ya que en caso contrario incurrirías en una iolacion de la llave primaria, por ende el registro como tal no se estaría duplicando porque ya habría una diferencia.
La solución es no manejar PORQUE, ni FK, aunque si tu tabla almacenará muchos registros (entiéndase más de 500,000 registros) podrían volverse caóticas las consultas (muy lentas), para lo cual puedes usar los indices no únicos, pero como te comentaba dependería del motor que utilices.
Resumen:
Si se puede siempre que no manejes campos únicos.
Muchas gracias por tu respuesta.
En la tabla donde quiero repetir los registro no tengo primary Key ni foreign Key,
precisamente para poder duplicarlos, pero me gustaría saber como puedo repetir los
Registros mediante codiog o query.
Gracias
OK, igual puedes intentar con esto:
var
  Repetir,  i: Integer;
begin
Repetir := 10;
With Query1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('Insert Into Tabla (Campo1, Campo2, Campo3)');
    SQL.Add('Values (:Campo1, :Campo2, :Campo3)');
    ParamByName('Campo1').Value := 'valor del campo1';
    ParamByName('Campo2').Value := 'valor del campo2';
    ParamByName('Campo3').Value := 'valor del campo3';
    For i := 1 to Repetir do
      ExecSQL;
    End;
End;
Esto es una pequeña consulta con parámetros, que repite dentro de un ciclo la consulta de inserción con los mismos valores de registro.
Ojala te sirva de algo.
Gracias por tu respuesta:
Permíteme explicarme mejor. Lo que quiero es lo siguiente por ejemplo:
En una tabla tengo dos columnas: Producto y Cantidad
Producto Cantidad
item1 3
item2                2
Lo que pretendo es insertar en otra tabla los dos items de la tabla anterior pero de la siguiente manera:
Producto
item1
item1
item1
item2
item2
La cantidad de registros de cada item está determinada por el campo cantidad de la primera tabla. Agradecería sobremanera si pudieras ayudarme en esto.
Muchas gracias.
OK, creo haber comprendido desde la respuesta donde puse el digo, solo es cuestión de adaptarlo a tus necesidades, por lo que comentas en tu ultima participación asumo que es algo así como Tabla Maestro y Tabla Detalle, podría funcionar así:
{llamaré tabla1 al maestro (donde tienes item1....3) y tabla 2 al detalle (donde guardas el desglose item1....1, item1....1, item1....1)}
var
  Repetir,  i: Integer;
begin
 With qMaestro do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Insert Into Tabla1 (Producto, Cantidad)');
      SQL.Add('Values (:Producto, :Cantidad)');
      ParamByName('Producto').Value := edProducto.Text;   // el cual contendria Item1
      ParamByName('Cantidad').Value := StrToInt(edCantidad.Text); // el cual contendria  3
      ExecSQL;
    End;
   Repetir := edCantidad.Text;
   With qDetalle do
     begin
        Close;
        SQL.Clear;
        SQL.Add('Insert Into Tabla2 (Producto, Cantidad)');
        SQL.Add('Values (:Producto, :Cantidad)');
        ParamByName('Producto').Value := edProducto.Text;  // aqui volveria a ser  item1
        ParamByName('Cantidad').Value := 1;                          // aqui ponemos el 1 para que se ponga como una pieza
        For i := 1 to Repetir do                                                  // 'Repetir' almacenó la cantidad de piezas (3 para este ejemplo)  
                                                                                              // por lo tanto aseguramos que se ejecutará tres veces nuestra
                                                                                              // consulta, dando como resultado tres registros identicos de Item1...1
          ExecSQL;
     End;
End;
Ojalá te sirva saludos!
Respuesta
1
Podrías explicar un poco mejor la pregunta, ¿el campo donde esta especificado la cantidad de veces esta en el mismo registro?
Si, está en el mismo registro.
Te doy un ejemplo. Este campo sería el campo cantidad y el campo a repetir seria el campo Producto.
Tengo una tabla con los siguientes items
Descripción cantidad
productoN1 2
producton2 3
Me gustaría desplegar estos registros en otra tabla
De la siguiente manera:
producton1
producton1
producton2
producton2
producton2
Bueno el procedimiento es sencillo...
Te dejo un ejemplo en Delphi, donde Table1 y Table2 son TTable, y Table1 es la primera table de donde vas a sacar la información y Table2 donde sera almacenada:
procedure CopiarDatos;
var
  A, B : integer;
begin
Table1.Open;
Table2.Open;
Table1.First;
for A := 0 to Pred(Table1.RecordCount) do
begin
  for B := 0 to Pred(Table.FieldByName('cantidad').AsInteger) do
  begin
    Table2.Append;
    Table2.FieldbyName().AsString := Table.FieldByName('descripcion').AsString;
    Table2.Post;
  end;
  Table1.Next;
end;
end;
Respuesta
1
Deberías hacerlo mediante programa.
Por ejemplo:
Cargar cada campo en una variable y en un bucle añadir POR veces el registro.
Un ejemplo burdo en Delphi:
var Campo1, Campo2:string;
      X:word;
begin
   Campo1:=Tabla.Campo1.value;
   Campo2:=Tabla.Campo2.value;
   X:=Tabla.X.value;
   for n := 1 to X do
       Tabla.AppendRecord([Campo1, Campo2,X]);
end;
Respuesta
1
No comprendo la pregunta!..
Puedes plantearme exactamente lo que necesitas para ver si te puedo ayudar!
Agradezco tu interés en ayudarme pero
Gracias a otro experto del foro ya he logrado
hacer lo quería. Lo que yo pretendía era repetir los
registros de una tabla en otra subordinando la cantidad
de registros a la cantidad que estuviera definida en otro campo
del registro en cuestión. Por ejemplo:
Producto cantidad
item1 2
item2 3
Entonces desplegar estos registros en otra tabla de la siguiente manera:
item1
item1
item2
item2
item2
De todas maneras muchas gracias.
Respuesta
1
No utilizo Delphi, pero imagina que tendrás que crear una consulta y/o una vista, para que te aparezcan.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas