Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Numeros registros nuevos en la base de datos (https://www.clubdelphi.com/foros/showthread.php?t=94489)

igamerpc 03-03-2020 02:28:06

Numeros registros nuevos en la base de datos
 
Pasar a otra tabla, poner mensaje los numeros registros insertado nuevo.
El codigo recordcount es correcto?

ecfisa 03-03-2020 04:37:27

Hola.

Perdón pero no entiendo tu consulta, por favor expláyate un poco mas explicando la situación. Es decir, que es lo que debes pasar a otra tabla, que mensajes deseas poner. etc.

Por último, RecordCount no es un código, es una propiedad de la clase TDataSet.

Saludos :)

Neftali [Germán.Estévez] 03-03-2020 08:43:07

Cita:

Empezado por ivanmaes (Mensaje 536062)
Pasar a otra tabla, poner mensaje los numeros registros insertado nuevo.
El codigo recordcount es correcto?


Hola y bienvenido a los foros.
Al igual que le pasa a [ecfisa] yo tampoco te entiendo.


Sea porque tienes problemas con el idioma o porque eres nuevo, en cualquier caso intenta explicar mejor lo que necesitas y da detalles como la Base de Datos a la que te estás refiriendo.
Por último y lo más importante, intenta ser concreto en la pregunta.
De otra forma es imposible ayudarte.

igamerpc 03-03-2020 09:07:27

Disculpa falta explicar mas claro.

T muestro:

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;


Donde lo comentario

Código Delphi [-]
//memo1.lines.add('Ha insertado nuevo registro');

el resultado seria muchas lineas insertado insertado...
Quiero saber solo una linea ejemplo "Ha insertado 10 nuevos registros" solo una linea.
Aver si esto explico mejor.


NOTA: Edito tu código para añadir TAG's y que sea más lejible. Te animo también a revisar la guía de estilo si no lo has hecho.

Neftali [Germán.Estévez] 03-03-2020 09:26:16

Cita:

Empezado por ivanmaes (Mensaje 536067)
el resultado seria muchas lineas insertado insertado...
Quiero saber solo una linea ejemplo "Ha insertado 10 nuevos registros" solo una linea.
Aver si esto explico mejor.


Por lo que he entendido quieres un mensaje final con la líneas insertadas.
El problema es que en tu código el mensaje está dentro del procedimiento Insertar_Registro_Tabla_1.


Coloca ese mensaje al finalizar el While y añade un contador para saber cuantos has insertado.
Algo Así:


Código Delphi [-]
var
  cont:integer;
begin
  cont := 0;
  While Not MOD.Tabla2.Eof do Begin        
     cod1:=MOD.Tabla2.fieldbyName('CODIGO').Value;    
     ...    
     Insertar_Registro_Tabla_1('archivo', cod1, nom, Sender);    
     ...
     Inc(cont);
  end;
  // sacar el mensaje de resumen
  memo1.lines.add(Format('Se han insertado %d registros',[cont]));
...

kuan-yiu 03-03-2020 09:28:18

Mueve esa escritura al proceso superior.
Cambia esa escritura en 'memo1' dentro de 'Insertar_Registro_Tabla_1' por otra después de la llamada a ese proceso.
Código Delphi [-]
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;
memo1.lines.add('Número de registros insertados: '+ IntToStr(MOD.Tabla2.RecordCount));
Así suponiendo que insertes la tabla entera.

igamerpc 03-03-2020 09:39:38

Vale voy a probar. Muchas gracias. Eso lo que buscaba solucion.

igamerpc 03-03-2020 09:52:50

Las dos mensajes uno de Inc[cont] y el Recordcount me salio resultado numero filas y no de numeros insertados. Hay 100 registros, inserto 10 nuevos y salia 110 registros.

igamerpc 03-03-2020 10:03:25

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;
memo1.lines.add('Número de registros insertados: '+ IntToStr(MOD.Tabla2.RecordCount));  //Me sale numero filas y no numero insertados.
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;
    
   

   Except

   End;
   MOD.Tabla1.Refresh;

end;



Al igual Inc(cont) tb me sale mismo numero filas.

kuan-yiu 03-03-2020 10:21:20

Cita:

Empezado por ivanmaes (Mensaje 536071)
Las dos mensajes uno de Inc[cont] y el Recordcount me salio resultado numero filas y no de numeros insertados. Hay 100 registros, inserto 10 nuevos y salia 110 registros.

Claro, ya dije que Recordcount indica el número total de filas de una tabla.
Si solo recorres tabla2 a partir de un punto entonces debes utilizar un contador tal como indica Neftali e incrementar el contador en el lugar donde se produzca la grabación efectiva para evitar fallos en el recuento. Puedes pasarlo como parámetro por referencia.

igamerpc 03-03-2020 10:32:11

Eso es verdad. Muchas gracias todo de eso. Lo intento otra forma para conseguir.

engranaje 03-03-2020 16:02:16

Es posible que falte información para darte una solución, como la versión de delphi con la que estas trabajando, pero te recomiendo que mires la propiedad RowsAffected. deduzco que MOD.MyCommand1 es un tMyCommand y debería disponer esta property.

Propongo que pruebes a modificar tu código de la siguiente manera y compruebes el comportamiento de estas modificaciones.

Código Delphi [-]

procedure TForm1.Button2Click(Sender: TObject);
var   
   archivo: String;
   cod1  : Cardinal;   
   nom: string;
  iTotalRegistrosAfectados:integer;
begin 
 iTotalRegistrosAfectados :=0; 
 While Not MOD.Tabla2.Eof do
 Begin         
    cod1:=MOD.Tabla2.fieldbyName('CODIGO').Value;
    nom:=MOD.Tabla2.fieldbyName('NOMBRE').Value;         
    iTotalRegistrosAfectados := iTotalRegistrosAfectados + Insertar_Registro_Tabla_1('archivo', cod1, nom, Sender);
    CFG.MOD.Tabla2.Next;    
 end; 
 memo1.lines.add('Número de registros insertados: '+ IntToStr(iTotalRegistrosAfectados )); 
end;

function TForm1.Insertar_Registro_Tabla_1(NTabla:String; cod1:cardinal; nom:string; Sender: TObject):integer;
 var 
   iRegistrosAfectados:integer;
 begin
    iRegistrosAfectados := 0;  

    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;     
       iRegistrosAfectados := MOD.MyCommand1.RowsAffected;
    Except     
    End;    
    
    MOD.Tabla1.Refresh;    
    result := iRegistrosAfectados ; 
end;

engranaje 03-03-2020 16:14:50

En mi mensaje anterior cometí el error de no comprobar la vista previa y el código delphi no contenría los saltos de línea. El resultado fué que las líneas fueron tan largas que no tenía visible en el navegador el "botón" para editar, así que intenté solucionarlo en este segundo mensaje. Pero al darme cuenta de que la solución era tan sencilla como ampliar la ventana del navegador (bastante, eso es cierto), he podido editarlo.

Este mensaje ahora carece de sentido y solicito si es posible que sea borrado por algún administrador.

Gracias y disculpas.

igamerpc 03-03-2020 17:12:21

Cita:

Empezado por engranaje (Mensaje 536081)
En mi mensaje anterior cometí el error de no comprobar la vista previa y el código delphi no contenría los saltos de línea. El resultado fué que las líneas fueron tan largas que no tenía visible en el navegador el "botón" para editar, así que intenté solucionarlo en este segundo mensaje. Pero al darme cuenta de que la solución era tan sencilla como ampliar la ventana del navegador (bastante, eso es cierto), he podido editarlo.

Este mensaje ahora carece de sentido y solicito si es posible que sea borrado por algún administrador.

Gracias y disculpas.


Ya me di cuenta. Lo comprobe pero no funciono. Es raro lo de sumar con la llamada de procedure. Ya encontrare algun dia una solucion de eso.



Y de nada.

ecfisa 03-03-2020 18:58:17

Hola.
Cita:

Empezado por igamerpc (Mensaje 536084)
Ya me di cuenta. Lo comprobe pero no funciono. Es raro lo de sumar con la llamada de procedure. Ya encontrare algun dia una solucion de eso.

No tanto, la idea es tener un acumulador que se pone a cero al iniciar el ingreso en lote y se incrementa en cada ingreso, al finalizar con los ingresos se muestra el valor del contador.

El acumulador/contador lo podes declarar como: Variable privada al formulario, global a la unidad o pasar una variable por referencia al procedimiento Insertar_Registro_Tabla_1.

Ejemplo simplificado de un caso mixto (variable privada al form y parámetro por referencia):
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    FDConnection1: TFDConnection;
    FDQuery1: TFDQuery;
    FDQuery2: TFDQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    btnInsert: TButton;
    procedure btnInsertClick(Sender: TObject);
  private
    { Private declarations }
    FCountRec: Integer;
    procedure InsertarRegistro(aTable: string; const codigo: Integer;
      const nombre: string; var aCont: Integer);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation  {$R *.dfm}

procedure TForm1.InsertarRegistro(aTable: string; const codigo: Integer;
  const nombre: string; var aCont: Integer);
begin
  FDQuery2.Close;
  FDQuery2.SQL.Text := 'INSERT INTO ' + aTable +
    '(CODIGO, NOMBRE) VALUES(:COD, :NOM)';
  FDQuery2.ParamByName('COD').AsInteger := codigo;
  FDQuery2.ParamByName('NOM').AsString  := nombre;
  try
    FDQuery2.ExecSQL;
    Inc(aCont);
  except on E: Exception do
     Application.ShowException(E);
  end;
end;

procedure TForm1.btnInsertClick(Sender: TObject);
begin
  FCountRec := 0;  // Se inicializa el contador en cero
  while not FDQuery1.Eof do
  begin
    InsertarRegistro('TABLA2',
                      FDQuery1.FieldByName('CODIGO').AsInteger,
                      FDQuery1.FieldByName('NOMBRE').AsString,
                      FCountRec {<- se incrementa si todo ok } );
    FDQuery1.Next;
  end;
  ShowMessageFmt('Se insertaron %d registros',[FCountRec]); // Mostrar registros ingresados
end;

Saludos :)

igamerpc 04-03-2020 10:30:43

Me funciono numero registro añadidos. Muchas gracias por la solucion, ecfisa. Esta forma igual la tuya pero algunos pequeños cambios. Y me funciono bien.
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  archivo: String;
  cod1  : Cardinal;
  nom: string;
begin
FCountRec:=0;
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, FCountRec, Sender);
        CFG.MOD.Tabla2.Next;
   end;
memo1.lines.add(format('Se insertaron %d registros',[FCountRec]));
end;

procedure TForm1.Insertar_Registro_Tabla_1(NTabla:String; cod1:cardinal; nom:string; var aCont: Integer; 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;
    Inc(aCont);

   Except

End;
   MOD.Tabla1.Refresh;
end;

ecfisa 04-03-2020 11:38:13

Hola.
Cita:

Empezado por igamerpc (Mensaje 536092)
Me funciono numero registro añadidos. Muchas gracias por la solucion, ecfisa. Esta forma igual la tuya pero algunos pequeños cambios. Y me funciono bien.
...

Me alegra mucho que te funcione ! ^\||/

Saludos :)


La franja horaria es GMT +2. Ahora son las 08:41:18.

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