Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-05-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
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;
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #2  
Antiguo 19-05-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 20-05-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
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.
Responder Con Cita
  #4  
Antiguo 20-05-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
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
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #5  
Antiguo 20-05-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Cita:
Empezado por Al González Ver Mensaje
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
Saludos
__________________
Siempre Novato
Responder Con Cita
  #6  
Antiguo 20-05-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por oscarac Ver Mensaje
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 Ver Mensaje
Me alegro que le metas mano a este hilo, ya me conoces, yo seria bueno en el béisbol
Deberíamos formar un equipo entre los colegas Delphi. Podríamos llamarnos los Callbacks de Iberoamérica.

Un abrazo en la tercera base.

Al González.
Responder Con Cita
  #7  
Antiguo 20-05-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
Bien explicadito....
efectivamente, la tabla tendra los mismo campos, asi que lo pasare al Create... voy aprobar y te comento
gracias
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #8  
Antiguo 20-05-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
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
__________________
Dulce Regalo que Satanas manda para mi.....

Última edición por oscarac fecha: 01-06-2011 a las 05:26:02.
Responder Con Cita
  #9  
Antiguo 20-05-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
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.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como reutilizar el codigo Tauro78 .NET 1 04-01-2010 15:05:51
Reutilizar codigo Tauro78 OOP 3 26-02-2009 23:12:41
Reutilizar/ copiar unidades Benito Varios 6 14-06-2006 22:27:19
Reutilizar codigo Perio Varios 7 17-11-2005 21:26:24
Reutilizar resultado de SQL en SQL javiermorales SQL 9 06-09-2003 19:11:32


La franja horaria es GMT +2. Ahora son las 09:35: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
Copyright 1996-2007 Club Delphi