Ir al contenido


Foto

[RESUELTO] Problema con INSERT INTO Firebird


  • Por favor identifícate para responder
7 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 11 marzo 2010 - 08:46

A ver, no sé si es que me pasé el tiempo programando en PHP en estos días que se me ha olvidado las reglas básicas de Dephi ^o|, estoy tratando de insertar los datos a una tabla desde otra tabla, lógico que ambos tienen los mismos campos:



delphi
  1. procedure TFAstGen.btn1Click(Sender: TObject);
  2. begin
  3. QGetRows.Close;
  4. QGetRows.SQL.Clear;
  5. QGetRows.SQL.Text := 'SELECT * FROM LOG_ASISTENCIA';
  6. QGetRows.Open;
  7.  
  8. //pbProgreso.Max := QGetRows.RecordCount;
  9.  
  10. if QGetRows.RecordCount > 0 then begin
  11.  
  12.   QGetRows.First;
  13.   while not QGetRows.Eof do begin
  14.   //pasamos los datos del log a la tabla oficial
  15.   //Registramos si es entrada
  16.   if QGetRows.FieldByName('LOG_STATUS').Value = 1 then begin
  17.         try
  18.             QGetLogData.Close;
  19.             QGetLogData.SQL.Clear;
  20.             QGetLogData.SQL.Text := 'INSERT INTO ASISTENCIA (EMP_ID,AST_FECHA,AST_ENT, CA_ID)' +
  21.                             ' SELECT EMP_ID, LOG_FECHA, LOG_TIME, 1 FROM LOG_ASISTENCIA';
  22.             QGetLogData.ExecSQL;
  23.         except
  24.           ShowMessage('Hubo un problema con la tabla');
  25.         end;
  26.   end;
  27.   QGetRows.Next;
  28.   end;
  29.     DM.ZData.Commit;
  30. end else ShowMessage('No hay registro que generar!');
  31. end;



El caso es que me repite los registros varias veces :(
  • 0

#2 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 11 marzo 2010 - 08:50

Saludos.

Amigo debe repetirte todas las inserciones porque lo tienes en un Loop.

Deberías de ver si es posible que lo quites de ese Loop y pongas un "WHERE" en tu sentencia select.
  • 0

#3 Alfredo

Alfredo

    Advanced Member

  • Miembros
  • PipPipPip
  • 91 mensajes
  • LocationMéxico

Escrito 11 marzo 2010 - 11:38

Pues si, lo tienes en un ciclo, asi que debe insertar los registros varias veces, segun entiendo el codigo que pusiste lo que quieres es copiar los registros de la tabla Log_Asistencia que tengan el valor de 1 en el campo Log_Status en la tabla Asistencia. Eso lo puedes hacer en un simple query y sin necesidad del ciclo
algo como esto


delphi
  1. [size=1] QGetLogData.Close;
  2. QGetLogData.SQL.Clear;
  3. QGetLogData.SQL.Text := 'INSERT INTO ASISTENCIA(EMP_ID,AST_FECHA,AST_ENT, CA_ID)' +
  4. ' SELECT EMP_ID, LOG_FECHA, LOG_TIME, 1 FROM LOG_ASISTENCIA'; 
  5. QGetLogData.ExecSQL;[/size]



Siempre y cuando las dos tablas esten en la misma base de datos, en caso contrario
si necesitarias dos querys y el ciclo, pero entonces, cambiarias un poco la sentencia de insercion a algo como esto:


sql
  1. QGetLogData.SQL.Clear;
  2. QGetLogData.SQL.Text := 'INSERT INTO ASISTENCIA(EMP_ID,AST_FECHA,AST_ENT, CA_ID)' +
  3. ' Values (:Emp_Id,:Ast_Fecha,:Ast_Ent,:Ca_Id)'
  4. QGetLogData.ExecSQL;[/SIZE]



Espero no haber enredado mas el asunto, y lo siento si se ve mal el código, me enrede con las etiquetas  :embarrassed:
  • 0

#4 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 12 marzo 2010 - 12:30



sql
  1. INSERT INTO ASISTENCIA (EMP_ID,AST_FECHA,AST_ENT, CA_ID) 
  2.                                   SELECT EMP_ID, LOG_FECHA AS AST_FECHA, LOG_TIME AS AST_ENT, 1 AS CA_ID FROM LOG_ASISTENCIA



LOS CAMPOS DEBEN DE SER DEL MISMO TIPO Y NOMBRARSE IGUAL...


  • 0

#5 Alfredo

Alfredo

    Advanced Member

  • Miembros
  • PipPipPip
  • 91 mensajes
  • LocationMéxico

Escrito 12 marzo 2010 - 12:38



sql
  1. INSERT INTO ASISTENCIA (EMP_ID,AST_FECHA,AST_ENT, CA_ID) 
  2.                                   SELECT EMP_ID, LOG_FECHA AS AST_FECHA, LOG_TIME AS AST_ENT, 1 AS CA_ID FROM LOG_ASISTENCIA



LOS CAMPOS DEBEN DE SER DEL MISMO TIPO Y NOMBRARSE IGUAL...


No, solamente deben ser del mismo tipo y estar en el mismo orden
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 12 marzo 2010 - 06:39

Gracias amigos ya lo hice de esta manera y me lo guarda como quiero ;):



delphi
  1. procedure TFAstGen.btn1Click(Sender: TObject);
  2. begin
  3. QGetRows.Close;
  4. QGetRows.SQL.Clear;
  5. QGetRows.SQL.Text := 'SELECT * FROM LOG_ASISTENCIA';
  6. QGetRows.Open;
  7.  
  8. //pbProgreso.Max := QGetRows.RecordCount;
  9.  
  10. if QGetRows.RecordCount > 0 then begin
  11.  
  12.   QGetRows.First;
  13.   while not QGetRows.Eof do begin
  14.   //pasamos los datos del log a la tabla oficial
  15.   //Registramos si es entrada
  16.   if QGetRows.FieldByName('LOG_STATUS').Value = 1 then begin
  17.         try
  18.             QGetLogData.Close;
  19.             QGetLogData.SQL.Clear;
  20.             QGetLogData.SQL.Text := 'INSERT INTO ASISTENCIA (EMP_ID,AST_FECHA,AST_ENT) VALUES(:EMP,:FECHA,:ENT)';
  21.             QGetLogData.ParamByName('EMP').Value := QGetRows.FieldByName('EMP_ID').AsInteger;
  22.             QGetLogData.ParamByName('FECHA').Value := QGetRows.FieldByName('LOG_FECHA').Value;
  23.             QGetLogData.ParamByName('ENT').Value := QGetRows.FieldByName('LOG_TIME').Value;
  24.             QGetLogData.ExecSQL;
  25.         except
  26.           ShowMessage('Hubo un problema con la tabla');
  27.         end;
  28.   end;
  29.   QGetRows.Next;
  30.   end;
  31.     DM.ZData.Commit;
  32. end else ShowMessage('No hay registro que generar!');
  33. end;



Eso es nada más es la primera parte de un laaargo código. Gracias a todos
  • 0

#7 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 13 marzo 2010 - 08:12

Este codigo lo puedes OPTIMIZAR de ls siguiente manera..





delphi
  1. procedure TFAstGen.btn1Click(Sender: TObject);
  2. Var
  3.   cSql:String;
  4. begin
  5. cSql := 'INSERT INTO ASISTENCIA (EMP_ID,AST_FECHA,AST_ENT, CA_ID)  ';
  6. cSql := cSql + '  SELECT EMP_ID, LOG_FECHA, LOG_TIME, 1 AS CA_ID FROM LOG_ASISTENCIA ';
  7. cSql := cSql + '  WHERE LOG_STATUS=1';
  8. Try
  9.     qryTemp.SQL.Clear;
  10.     qryTemp.SQL.Add(cSql);
  11.     qryTemp.ExecSql;
  12. except
  13.     ShowMessage('No hay registro que generar!');
  14. end;
  15. end;




SALUDOS..

  • 0

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 13 marzo 2010 - 08:48

Muchas gracias pcicom, eso sí es más corto :p (y).
  • 0




IP.Board spam blocked by CleanTalk.