Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Registro Duplicado (https://www.clubdelphi.com/foros/showthread.php?t=94490)

igamerpc 03-03-2020 12:06:53

Registro Duplicado
 
Una pregunta el registro duplicado con ese se puede hacer.
Codigo: int --> Primary Key
Nombre: char


Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  archivo: String;
  cod1  : Cardinal;
  nom: string;
begin
While Not MOD.Tabla2.Eof do
      Begin
        cod1:=MOD.Tabla2.fieldbyName('CODIGO').Value;
        nom:=MOD.Tabla2.fieldbyName('NOMBRE').Value;

        Insertar_Registro_Tabla_1('archivo', cod1, nom, Sender);
        CFG.MOD.Tabla2.Next;
      end;
end;


procedure TForm1.Insertar_Registro_Tabla_1(NTabla:String; cod1:cardinal; nom:string; Sender: TObject);
begin
   If MOD.Conexion.Connected =False Then
       MOD.Conexion.Connected:=True;

    MOD.Tabla1.TableName:=NTabla;
    MOD.Tabla1.Active:=True;

    MOD.MyCommand1.SQL.Clear;
    MOD.MyCommand1.sql.Add('INSERT INTO '+NTabla+'(CODIGO,NOMBRE) VALUES(:Codigo,:Nombre)');
    MOD.MyCommand1.ParamByName('CODIGO').Value:=cod1;
    MOD.MyCommand1.ParamByName('NOMBRE').Value:=nom;

   Try
    MOD.MyCommand1.Execute;
    //memo1.lines.add('Ha insertado nuevo registro');
   

   Except

   End;
   MOD.Tabla1.Refresh;

end;

ecfisa 03-03-2020 13:47:55

Hola.

Si la columna CODIGO es primary key, no puede estar duplicada. Lo que se puede hacer es, mostrarle un mensaje al usuario que ese código ya está en uso y solicitarle otro o generarle uno automáticamente.

En cuanto al procedimiento que inserta un nuevo registro lo modificaría un poco:
Código Delphi [-]
procedure TForm1.Insertar_Registro_Tabla_1(NTabla:String; cod1:cardinal; nom:string; Sender: TObject);
begin
   If MOD.Conexion.Connected = False Then
       MOD.Conexion.Connected:=True;

    MOD.Tabla1.TableName := NTabla;
    MOD.Tabla1.Active    := True;

    MOD.MyCommand1.SQL.Clear;
    MOD.MyCommand1.sql.Add('INSERT INTO ' + NTabla+
      '(CODIGO,NOMBRE) VALUES(:Codigo,:Nombre)');
    MOD.MyCommand1.ParamByName('CODIGO').Value := cod1;
    MOD.MyCommand1.ParamByName('NOMBRE').Value := nom;

    try                       // Intentar la operación
      MOD.MyCommand1.Execute; // Insertar
      Inc(FCount);            // Incrementar el número de registros insertados
      MOD.Tabla1.Refresh;     // Actualizar
    except on E: Exception do       // ¿ Hubo algún error ?
      Application.ShowException(E); // Mostrarlo
    end;
end;
En este ejemplo y en el caso de existir una clave duplicada, se le avisa al usuario con un mensaje de error.

Saludos :)

igamerpc 03-03-2020 14:19:46

Cita:

Empezado por ecfisa (Mensaje 536077)
Hola.

Si la columna CODIGO es primary key, no puede estar duplicada. Lo que se puede hacer es, mostrarle un mensaje al usuario que ese código ya está en uso y solicitarle otro o generarle uno automáticamente.

En cuanto al procedimiento que inserta un nuevo registro lo modificaría un poco:
Código Delphi [-]
procedure TForm1.Insertar_Registro_Tabla_1(NTabla:String; cod1:cardinal; nom:string; Sender: TObject);
begin
   If MOD.Conexion.Connected = False Then
       MOD.Conexion.Connected:=True;

    MOD.Tabla1.TableName := NTabla;
    MOD.Tabla1.Active    := True;

    MOD.MyCommand1.SQL.Clear;
    MOD.MyCommand1.sql.Add('INSERT INTO ' + NTabla+
      '(CODIGO,NOMBRE) VALUES(:Codigo,:Nombre)');
    MOD.MyCommand1.ParamByName('CODIGO').Value := cod1;
    MOD.MyCommand1.ParamByName('NOMBRE').Value := nom;

    try                       // Intentar la operación
      MOD.MyCommand1.Execute; // Insertar
      Inc(FCount);            // Incrementar el número de registros insertados
      MOD.Tabla1.Refresh;     // Actualizar
    except on E: Exception do       // ¿ Hubo algún error ?
      Application.ShowException(E); // Mostrarlo
    end;
end;
En este ejemplo y en el caso de existir una clave duplicada, se le avisa al usuario con un mensaje de error.

Saludos :)


Exacto. Muchas gracias. Sabia q primary key no puede duplicar.

igamerpc 06-03-2020 17:19:19

Una tema complicado sobre duplicacion. Cuando hay autonumeración o no hay llave se puede duplicar?

ecfisa 07-03-2020 00:17:19

Hola.

Si la columna no tiene una restricción al respecto, no hay problema con duplicarla. ¿ Con que gestor de base de datos estas trabajando ?

Saludos :)

igamerpc 07-03-2020 00:52:46

En phpmyadmin lo d localhost. Las restricciones solo un campo primary key se que no puede duplicar. Si pongo otro campo con autonumeración yo imagino se puede duplicar. Aun no comprobe. Lo estoy estudiando como funciona. Es un poco lio de eso.

ecfisa 07-03-2020 01:51:56

Hola.

No conozco MySQL pero no tiene mucho sentido crear una columna auto numérica para luego permitir valores duplicados en ella; se supone que la función de esas columnas es no repetir valores.

Creo que si deseas permitir valores duplicados tendrías que quitar la restricción, v.gr.:
Código SQL [-]
ALTER TABLE nombre_de_tu_tabla DROP INDEX nombre_de_columna

Saludos :)

igamerpc 07-03-2020 02:03:42

Drop index es eliminar el indice, eso es verdad, y asi se puede duplicar.
Entonces empiezo trabajar delphi con esa ejecucion.
Gracias 😁

igamerpc 09-03-2020 11:50:17

Código SQL [-]
ALTER TABLE nombre_de_tu_tabla DROP INDEX nombre_de_columna



Ese no puede usar en delphi.

Ejemplo:
Código Delphi [-]
MOD.MyCommand1.SQL('ALTER TABLE nombre_de_tu_tabla DROP INDEX nombre_de_columna');

ecfisa 09-03-2020 13:41:21

Hola.

Para poder ayudarte mejor te hago una consulta, ¿ Con que componentes estas trabajando ? (dbExpress, FireDAC, ...)

Saludos :)

igamerpc 09-03-2020 13:52:39

Código Delphi [-]
procedure TForm1.Insertar_Registro_Tabla_1(NTabla:String; cod1:cardinal; nom:string; Sender: TObject); 
begin 
  If MOD.Conexion.Connected = False Then 
    MOD.Conexion.Connected:=True; 
  MOD.Tabla1.TableName := NTabla; 
  MOD.Tabla1.Active := True; 
  MOD.MyCommand1.SQL.Clear; 
  MOD.MyCommand1.sql.Add('INSERT INTO ' + NTabla+ '(CODIGO,NOMBRE) VALUES(:Codigo,:Nombre)'); 
  MOD.MyCommand1.ParamByName('CODIGO').Value := cod1; 
  MOD.MyCommand1.ParamByName('NOMBRE').Value := nom; 
  try // Intentar la operación 
    MOD.MyCommand1.Execute; 
    // Insertar 
    Inc(FCount); // Incrementar el número de registros insertados 
    MOD.Tabla1.Refresh; // Actualizar 
  except 
    on E: Exception do // ¿ Hubo algún error ? 
      Application.ShowException(E); // Mostrarlo 
  end; 
end;
Mismo eso lo quiero es desactivar el primary key para que pueda duplicar en ejecutar delphi 7. Hago en opciones con o sin primary key.
Trabajo delphi 7 con phpmyadmin en localhost.

igamerpc 09-03-2020 13:55:23

Pido disculpa lo hecho TAG pero no me sale bien.

Casimiro Noteví 09-03-2020 14:10:37

Cuando lo hagas, envía el mensaje. Luego, si hace falta, lo editas. Es un problema que se da a veces, si le pulsas a "vista previa" antes de enviar el mensaje entonces sale así de mal.

ecfisa 09-03-2020 15:12:35

Hola.

Perdón por la pregunta, ahora ví que mencionaste a phpmyadmin, lamentablemente no conozco esos componentes.

Saludos :)

igamerpc 09-03-2020 16:40:48

vale no pasa nada no te preocupes


La franja horaria es GMT +2. Ahora son las 18:27:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi