Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   reutilizar ClientDataSet (https://www.clubdelphi.com/foros/showthread.php?t=73846)

oscarac 19-05-2011 20:48:43

reutilizar ClientDataSet
 
buenas tardes
estoy creando una tabla temporal usando mas o menos esto

Código Delphi [-]
 
  CDSFacturacion.FieldDefs.Add('CCosto', ftString, 10);
  CDSFacturacion.FieldDefs.Add('Codigo', ftString, 10);
  CDSFacturacion.FieldDefs.Add('Trabajador', ftString, 80);
  CDSFacturacion.CreateDataSet;
  CDSFacturacion.Open;
entonces genero un reporte y me sale muy bien, el tema es que cuando sin salir del formulario le doy nuevamente en aceptar (para generar otro reporte) me sale el siguiente mensaje de error

Cita:

First chance exception at $7C812AFB. Exception class EDatabaseError with message 'CDSFacturacion: Duplicate index name 'Codigo''. Process Comedor.exe (3680)
OJO al final estoy colocando

Código Delphi [-]
 
CDSFacturacion.free;

Caral 19-05-2011 21:03:05

Hola
De nada sirve liberarla asi.
Me da la impresion de que tendrias que cerrarla antes ya que usas ADD.
Prueba asi:
Código Delphi [-]
  CDSFacturacion.Close;
  CDSFacturacion.FieldDefs.Add('CCosto', ftString, 10);
  CDSFacturacion.FieldDefs.Add('Codigo', ftString, 10);
  CDSFacturacion.FieldDefs.Add('Trabajador', ftString, 80);
  CDSFacturacion.CreateDataSet;
  CDSFacturacion.Open;
Ademas: Si no se usa un Try, no funciona bien la liberacion.
Saludos

Al González 20-05-2011 02:18:14

Hola oscarac, saludos Carlos. :)

Parece que el problema es que intentas crear por segunda vez los elementos (definiciones, campos, etc.) del conjunto de datos, cuando eso ya fue hecho en la primera ejecución.

Para estar seguros, ¿podrías poner aquí el código de tu formulario? Al menos lo que en esencia se relaciona con el caso.

Saludos.

Al González.

oscarac 20-05-2011 04:12:45

Efectivamente Al Gonzales

lo que estoy haciendo es crear dentro del formulario una tabla temporal, entonces le doy click al boton aceptar y me crea la tabla temporal y me genera el reporte, hasta ahi todo bien

pero cuando doy click nuevamente (para otro rango de fechas), me sale ese error

estoy haciendo esto

Código Delphi [-]
 
  CDSFacturacion.Close;
  CDSFacturacion.FieldDefs.Clear;
  CDSFacturacion.FieldDefs.Add('Cos', ftString, 10);
  CDSFacturacion.FieldDefs.Add('Codigo', ftString, 10);
  CDSFacturacion.FieldDefs.Add('Trabajador', ftString, 80);
  for x:= 1 to 31 do
    Begin
      for y := 1 to 6 do
        begin
          if y = 1 then _campo1 := 'Desa';
          if y = 2 then _campo1 := 'Almu';
          if y = 3 then _campo1 := 'Sala';
          if y = 4 then _campo1 := 'Lonc';
          if y = 5 then _campo1 := 'Cena';
          if y = 6 then _campo1 := 'Aman';
          _Campo2 := _Campo1 + Llenar( IntToStr(x),2);
          CDSFacturacion.FieldDefs.Add(_Campo2, ftFloat,0,False);
          end;
        End;
  CDSFacturacion.FieldDefs.Add('tDesa', ftFloat, 0, False);
  CDSFacturacion.FieldDefs.Add('tAlmu', ftFloat, 0, False);
  CDSFacturacion.FieldDefs.Add('tSala', ftFloat, 0, False);
  CDSFacturacion.FieldDefs.Add('tLonc', ftFloat, 0, False);
  CDSFacturacion.FieldDefs.Add('tCena', ftFloat, 0, False);
  CDSFacturacion.FieldDefs.Add('tAman', ftFloat, 0, False);
  CDSFacturacion.IndexDefs.Add('Codigo','Codigo', []);
  CDSFacturacion.CreateDataSet;
  CDSFacturacion.Open;
  CDSFacturacion.Edit;

al final hago mas o menos esto
Código Delphi [-]
 
 
 CDSFacturacion.EmptyDataSet;
  CDSFacturacion.Close;
  CDSFacturacion.Free;

podrias darme alguna sugerencia?

saludos

Caral 20-05-2011 04:26:53

Hola
Cita:

Empezado por Al González (Mensaje 400720)
Hola oscarac, saludos Carlos. :)

Parece que el problema es que intentas crear por segunda vez los elementos (definiciones, campos, etc.) del conjunto de datos, cuando eso ya fue hecho en la primera ejecución.

Para estar seguros, ¿podrías poner aquí el código de tu formulario? Al menos lo que en esencia se relaciona con el caso.

Saludos.

Al González.

Igualmente te envió saludos amigo Al.
Me alegro que le metas mano a este hilo, ya me conoces, yo seria bueno en el béisbol :D
Saludos

Al González 20-05-2011 07:58:54

Cita:

Empezado por oscarac (Mensaje 400723)
podrias darme alguna sugerencia?

Veo en tu código que limpias las definiciones de campos (FieldDefs.Clear), mas no las definiciones de índices. Eso explicaría el mensaje de error que nos comentabas al principio.

Por otro lado, no me queda claro si el conjunto de datos tendrá en todo momento los mismos campos. Si esto es así, te aconsejo emplear el evento OnCreate del formulario para colocar ahí el código que prepara el conjunto de datos. De tal suerte que en el evento OnClick del botón Aceptar tengas solamente lo que corresponda a la operación en turno. Así no tendrás que definir los campos e índices cada vez.

En el código del botón Aceptar sólo necesitarías llamar al método CreateDataSet, realizar la operación que necesitas y luego llamar al método Close:
Código Delphi [-]
procedure TForm1.btAceptarClick(Sender: TObject);
begin
  CDSFacturacion.CreateDataSet;

  // Código de la operación a realizar con CDSFacturacion

  CDSFacturacion.Close;
end;

Adicionalmente, si el conjunto de datos fue añadido al formulario en tiempo de diseño, no tienes necesidad de destruirlo (llamada a Free), puesto que todo componente agregado a un formulario es destruido automáticamente cuando el formulario es liberado.

Espero haberme explicado.

Cita:

Empezado por Caral (Mensaje 400724)
Me alegro que le metas mano a este hilo, ya me conoces, yo seria bueno en el béisbol :D

Deberíamos formar un equipo entre los colegas Delphi. Podríamos llamarnos los Callbacks de Iberoamérica. :cool: :p

Un abrazo en la tercera base.

Al González. :)

oscarac 20-05-2011 16:22:01

Bien explicadito....
efectivamente, la tabla tendra los mismo campos, asi que lo pasare al Create... voy aprobar y te comento
gracias

oscarac 20-05-2011 16:36:35

estoy colocando el codigo aqui (completo), a ver si me pueden decir que estoy haciendo mal, la primara vez funciona perfecto, pero a la segunda
me sale que no tiene Provider :S

Al González 20-05-2011 18:54:46

Hola Oscarac.

El error aparece porque estás llamando al método Open en lugar de llamar al método CreateDataSet. El método CreateDataSet es como si fuera un "Open" pero sin leer nada de una base de datos.

Debes quitar la llamada a CreateDataSet del evento OnCreate y ponerla, como te comenté antes, en el código del botón (en lugar de Open).

Saludos.

Al González. :)


La franja horaria es GMT +2. Ahora son las 13:23:43.

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