Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-07-2007
pennylane pennylane is offline
Miembro
 
Registrado: feb 2007
Posts: 14
Poder: 0
pennylane Va por buen camino
Problema

Tengo un problema con este codigo:

Código Delphi [-]
     DataModule1.IBDataSet2.Active := False;
     DataModule1.IBDataSet2.SelectSQL.Clear;  //Borro SQL anteriores
     DataModule1.IBDataSet2.SelectSQL.Text := 'SELECT ID, Marcaje, Parada, Entrada, Remate, TiroLibre, Desmarque, Creatividad, Regate, Pase, Control FROM JUGADORES';
     DataModule1.IBDataSet2.Prepare;
     DataModule1.IBDataSet2.Active := True;
     DataModule1.IBDataSet2.Open;

//ShowMessage(IntToStr(DataModule1.IBDataSet2.Recordcount));

     DataModule1.IBDataSet2.First;
     while not DataModule1.IBDataSet2.Eof do
     begin
       //Comienzo a recuperar los valores
       ID := DataModule1.IBDataSet2.Fields[0].AsInteger;

       MARCAJE     := DataModule1.IBDataSet2.Fields[1].AsInteger;
       PARADA      := DataModule1.IBDataSet2.Fields[2].AsInteger;
       ENTRADA     := DataModule1.IBDataSet2.Fields[3].AsInteger;
       REMATE      := DataModule1.IBDataSet2.Fields[4].AsInteger;
       DESMARQUE   := DataModule1.IBDataSet2.Fields[5].AsInteger;
       CREATIVIDAD := DataModule1.IBDataSet2.Fields[6].AsInteger;
       REGATE      := DataModule1.IBDataSet2.Fields[7].AsInteger;
       PASE        := DataModule1.IBDataSet2.Fields[8].AsInteger;
       CONTROL     := DataModule1.IBDataSet2.Fields[9].AsInteger;

//       DataModule1.IBTransaction1.Active:= False;  //ESTA LINEA ME DESACTIVA EL IBDATASET2
//       DataModule1.IBTransaction1.StartTransaction;

       DataModule1.IBSQL1.sql.clear; //Borro SQL anteriores
       DataModule1.IBSQL1.SQL.add ('UPDATE JUGADORES');
       DataModule1.IBSQL1.SQL.Add('SET PORTERO   = PORTERO, ');
       DataModule1.IBSQL1.SQL.Add('DEFENSA   = DEFENSA, ');
       DataModule1.IBSQL1.SQL.Add('MEDIO     = MEDIO, ');
       DataModule1.IBSQL1.SQL.Add('DELANTERO = DELANTERO ');
       DataModule1.IBSQL1.SQL.Add('WHERE ID = ID'); //Cargo la SQL

       DataModule1.IBSQL1.ParamByName('pPORTERO').AsFloat       := CalculaPosicion('Portero', MARCAJE, PARADA, ENTRADA, REMATE, TIROLIBRE, DESMARQUE, CREATIVIDAD, REGATE, PASE, CONTROL);
       DataModule1.IBSQL1.ParamByName('pDEFENSA').AsFloat       := CalculaPosicion('Defensa', MARCAJE, PARADA, ENTRADA, REMATE, TIROLIBRE, DESMARQUE, CREATIVIDAD, REGATE, PASE, CONTROL);
       DataModule1.IBSQL1.ParamByName('pMEDIO').AsFloat         := CalculaPosicion('Medio', MARCAJE, PARADA, ENTRADA, REMATE, TIROLIBRE, DESMARQUE, CREATIVIDAD, REGATE, PASE, CONTROL);
       DataModule1.IBSQL1.ParamByName('pDELANTERO').AsFloat     := CalculaPosicion('Delantero', MARCAJE, PARADA, ENTRADA, REMATE, TIROLIBRE, DESMARQUE, CREATIVIDAD, REGATE, PASE, CONTROL);
       DataModule1.IBSQL1.ParamByName('pID').AsInteger          := ID;

       try
          DataModule1.IBSQL1.ExecQuery; //Mando la SQL
       except
          DataModule1.IBTransaction1.Rollback;
       raise;
       end;
//       DataModule1.IBTransaction1.Commit; //Ejecuto la SQL
       DataModule1.IBDataSet2.Next; //Siguiente jugador
     end;

       DataModule1.IBTransaction1.Active:= False;  
       DataModule1.IBTransaction1.StartTransaction;
       DataModule1.IBTransaction1.Commit; //Ejecuto la SQL

La historia es cambiar una serie de campos de una tabla. Para calcular los valores de estos campos necesito recuperar el resto de campos, y es el primer SELECT que hago. Despues con la funcion CalculaPosicion, calcula el nuevo campo y hace un UPDATE para guardarlo. Al final debera pasar al siguiente jugador de la tabla (NEXT)

1- Esta linea me devuelve siempre uno y deberia ser en mi caso 16
Código Delphi [-]
ShowMessage(IntToStr(DataModule1.IBDataSet2.Recordcount));
Es curioso pq la primera parte del codigo sola, aunque el recordcount devuelve 1, si q funciona bien el while (16 veces). Con todo el codigo, el while solo se ejecuta una vez.

2-Estas lineas me cerraban el IBDataSet2 y me daba un error asi q las ejecuto al final del todo. No hay problema con eso no ??

Código Delphi [-]
       DataModule1.IBTransaction1.Active:= False;  //esta es la q cierra el IBDataSet2
       DataModule1.IBTransaction1.StartTransaction;
       DataModule1.IBTransaction1.Commit; //Ejecuto la SQL

Las caritas corresponden a : p pero me convierte al emoticono... sorry
Responder Con Cita
  #2  
Antiguo 07-07-2007
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
// DataModule1.IBTransaction1.Active:= False; //ESTA LINEA ME DESACTIVA EL IBDATASET2
// DataModule1.IBTransaction1.StartTransaction;

La primera línea que marcas te sobra ya que si cierras la transación te cierra el Dataset.

La segunda la tienes que abrir al empezar la operación de transvase de datos.

Y según parece su situación es correcta.

Cuando acabes la operación haces un Commit, lo cual veo que sería correcto.

Aquí se supone que acaba la operación, por lo tanto no veo claro que hacen la 3 últimas líneas.
Código Delphi [-]
 DataModule1.IBTransaction1.Active:= False;  
       DataModule1.IBTransaction1.StartTransaction;
       DataModule1.IBTransaction1.Commit; //Ejecuto la SQL
Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 07-07-2007
gabrielkc gabrielkc is offline
Miembro
 
Registrado: jun 2007
Ubicación: Chihuahua Mexico
Posts: 118
Poder: 17
gabrielkc Va por buen camino
Cita:
Empezado por pennylane
1- Esta linea me devuelve siempre uno y deberia ser en mi caso 16
ShowMessage(IntToStr(DataModule1.IBDataSet2.Recordcount));

y
En los dataset de Interbase el RecordCount no te devuelve el número de registros en el Set, sino la cantidad de registros por los que has "pasado".

es decir la primera vez te devuelve 1 siempre, si le das Next y vuelves a ejecutar la misma sentencia te devuelve 2 y si le das Next de nuevo y vuelves a ejecutar la misma sentencia te devuelve 3. No es exactamente un RecNo porque si le das un prior te devuelve 3 otra vez. Porque ya has explorado 3 registros.
Responder Con Cita
  #4  
Antiguo 07-07-2007
gabrielkc gabrielkc is offline
Miembro
 
Registrado: jun 2007
Ubicación: Chihuahua Mexico
Posts: 118
Poder: 17
gabrielkc Va por buen camino
Cita:

DataModule1.IBDataSet2.Active := False; DataModule1.IBDataSet2.SelectSQL.Clear; //Borro SQL anteriores
DataModule1.IBDataSet2.SelectSQL.Text := 'SELECT ID, Marcaje, Parada, Entrada, Remate, TiroLibre, Desmarque, Creatividad, Regate, Pase, Control FROM JUGADORES';
DataModule1.IBDataSet2.Prepare;
DataModule1.IBDataSet2.Active := True;//Esta linea no es necesaria
DataModule1.IBDataSet2.Open;



No es necesario que Actives el IBDataSet y luego llames el Open
el procedimiento Open Activa el DataSet



DataModule1.IBDataSet2.First;
No es necesario que llames el First ya que acabas de abrir el
Dataset este se encuentra en el primer registro

Cita:
// DataModule1.IBTransaction1.Commit; //Ejecuto la SQL


El commit no ejecuta el SQL, quien ejecuta el SQL es el ExecSQL
el commit guarda definitivamente los datos en la BD
2-Estas lineas me cerraban el IBDataSet2 y me daba un error asi q las ejecuto al final del todo. No hay problema con eso no ??


Código Delphi [-]
     DataModule1.IBTransaction1.Active:= False;  //esta es la q cierra el IBDataSet2        
     DataModule1.IBTransaction1.StartTransaction;        
     DataModule1.IBTransaction1.Commit; //Ejecuto la SQL



No es necesaria esta última parte, despues de cada registro insertado debes llamar el Commit, pero no es necesario que Desactives la Transaccion.

Es decir el Commit debería ir en el Try en el que llamas el ExcelSQL no al final del While

Última edición por marcoszorrilla fecha: 07-07-2007 a las 17:31:05.
Responder Con Cita
  #5  
Antiguo 07-07-2007
gabrielkc gabrielkc is offline
Miembro
 
Registrado: jun 2007
Ubicación: Chihuahua Mexico
Posts: 118
Poder: 17
gabrielkc Va por buen camino
Que pasó con las citas?????
si algun moderador puede corregirlas y explicarme como hacer varias citas en una respuesta por favor
Responder Con Cita
  #6  
Antiguo 07-07-2007
gabrielkc gabrielkc is offline
Miembro
 
Registrado: jun 2007
Ubicación: Chihuahua Mexico
Posts: 118
Poder: 17
gabrielkc Va por buen camino
Por último te recomiendo que leas la guia de estilo:

http://www.clubdelphi.com/foros/guiaestilo.php


Recuerda poner títulos descriptivos, así como nosotros tratamos de ayudarte, con títulos descriptivos ayudas a que otra gente con tu problema pueda encontrar facilmente tu hilo. No solo desde el foro sino desde el mismísimo google, aumentando así la afluencia de gente al foro.

http://www.clubdelphi.com/foros/guia....php#preguntas

Saludos.
Responder Con Cita
  #7  
Antiguo 08-07-2007
pennylane pennylane is offline
Miembro
 
Registrado: feb 2007
Posts: 14
Poder: 0
pennylane Va por buen camino
Cita:
Empezado por marcoszorrilla
// DataModule1.IBTransaction1.Active:= False; //ESTA LINEA ME DESACTIVA EL IBDATASET2
// DataModule1.IBTransaction1.StartTransaction;

La primera línea que marcas te sobra ya que si cierras la transación te cierra el Dataset.

La segunda la tienes que abrir al empezar la operación de transvase de datos.

Y según parece su situación es correcta.

Cuando acabes la operación haces un Commit, lo cual veo que sería correcto.

Aquí se supone que acaba la operación, por lo tanto no veo claro que hacen la 3 últimas líneas.

Código Delphi [-]
DataModule1.IBTransaction1.Active:= False;
DataModule1.IBTransaction1.StartTransaction;
DataModule1.IBTransaction1.Commit; //Ejecuto la SQL




Un Saludo.
Graciaspor cotnestar. Si quito esa primera linea me sale el mensaje de error "Transaction is active".
Responder Con Cita
  #8  
Antiguo 08-07-2007
pennylane pennylane is offline
Miembro
 
Registrado: feb 2007
Posts: 14
Poder: 0
pennylane Va por buen camino
Primeramente agradecerte los consejos... Se nota que soy nuevo. El titulo poco informativo del post fue una equivocacion y luego ya no pude cambiarlo.


Cita:
Empezado por gabrielkc
No es necesario que llames el First ya que acabas de abrir el
Dataset este se encuentra en el primer registro


2-Estas lineas me cerraban el IBDataSet2 y me daba un error asi q las ejecuto al final del todo. No hay problema con eso no ??



Código Delphi [-]
DataModule1.IBTransaction1.Active:= False; //esta es la q cierra el IBDataSet2
DataModule1.IBTransaction1.StartTransaction;
DataModule1.IBTransaction1.Commit; //Ejecuto la SQL







No es necesaria esta última parte, despues de cada registro insertado debes llamar el Commit, pero no es necesario que Desactives la Transaccion.

Es decir el Commit debería ir en el Try en el que llamas el ExcelSQL no al final del While
Si no desactivo la transsaccion me sale un mensaje de error "Transaction is active"... es por eso que puse esas tres lineas de codigo despues del while
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 07:16:24.


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
Copyright 1996-2007 Club Delphi