Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Crear tabla temporal usando ClientDataSet (https://www.clubdelphi.com/foros/showthread.php?t=73813)

oscarac 18-05-2011 08:03:43

Crear tabla temporal usando ClientDataSet
 
buenas noches...
estoy tratando de crear una tabla usando ClienDataSet (si alguien conoce otro metodo aviseme por favor), el echo que uso este componente, es que quiero crear los campos de manera aleatorea (no siempre seran los mismos)

estoy haciendo mas o menos asi

Código Delphi [-]
 
 CDSFacturacion.FieldDefs.Add('CCosto', ftString, 10);
  CDSFacturacion.FieldDefs.Add('Codigo', ftString, 10);
  CDSFacturacion.FieldDefs.Add('Trabajador', ftString, 80);
  if x = 1 then _campo1 := 'Desa';
  if x = 2 then _campo1 := 'Almu';
  if x = 3 then _campo1 := 'Sala';
  if x = 4 then _campo1 := 'Lonc';
  if x = 5 then _campo1 := 'Cena';
  if x = 6 then _campo1 := 'Aman';
  with CDSFacturacion do
  Begin
    with FieldDefs.AddFieldDef do
    Begin
      DataType := ftInteger;
      Name := _Campo1;
    end;
  end;
  CDSFacturacion.CreateDataSet;
  CDSFacturacion.Active := True;
  CDSFacturacion.Open;

cuando llega al open me sale un mensaje que dice mas o menos asi

CDSFacturacion : Cannot perform this operation on an open dataset


alguien podria explicarme este error o que estoy haciendo mal o si existe otro metodo?

oscarac 18-05-2011 08:28:43

mmm al parecer solo debia eliminar la linea

Código Delphi [-]
 
CDSFacturacion.Active := True;
:eek::eek:

Al González 18-05-2011 16:27:12

Hola Oscarac.

"Active := True" es lo mismo que "Open", pero para crear el conjunto de datos en memoria, solamente necesitas llamar al método CreateDataSet. Éste lo crea vacío y abierto, listo para trabajar con él.

El error que mencionas posiblemente ocurre cuando intentas repetir la operación de definir los campos, estando aún el conjunto de datos abierto.

Saludos.

Al González. :)

oscarac 19-05-2011 06:24:25

ya logre crear la tabla, mi problema ahora es que no me esta guardando los datos que grabo, hago mas o menos esto
Con esto lo creo
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);
  if dtFechaFin.Date - dtFechaIni.Date > 31 then
    Begin
      MessageDlg('Periodo Excede los 31 dias del mes', mtError, [mbAbort], 0);
      Exit
    end;
  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);
          with CDSFacturacion do
          Begin
            with FieldDefs.AddFieldDef do
              Begin
                DataType := ftFloat;
                Name := _Campo2;
              end;
          end;
        end;
    end;
    CDSFacturacion.CreateDataSet;
//    CDSFacturacion.Active := True;
    CDSFacturacion.Open;

Con esto intento Grabar los datos

Código Delphi [-]
 
qryTemporal.First;
  while not qryTemporal.Eof do
  begin
    if not CDSFacturacion.Locate('Codigo', qryTemporalAux.AsString, []) then
      Begin
        CDSFacturacion.Append;
        CDSFacturacion.FieldByName('Codigo').Value := qryTemporalAux.AsString;
        CDSFacturacion.FieldByName('trabajador').Value := qryTemporalTrabajador.AsString;
        CDSFacturacion.FieldByName('Cos').Value := qryTemporalCos.Value;
        CDSFacturacion.Post;
      end;
      tblArticulo.Locate('KOD', qryTemporalKOD.AsString, []);
      if tblArticuloTIPO.AsString = '1' then _Campo1 := 'Desa';
      if tblArticuloTIPO.AsString = '2' then _Campo1 := 'Almu';
      if tblArticuloTIPO.AsString = '3' then _Campo1 := 'Sala';
      if tblArticuloTIPO.AsString = '4' then _Campo1 := 'Lonc';
      if tblArticuloTIPO.AsString = '5' then _Campo1 := 'Cena';
      if tblArticuloTIPO.AsString = '6' then _Campo1 := 'Aman';
      DecodeDate(qryTemporalf_DOC.AsDateTime, wAnyo, wMes, wDia);
      _Campo1 := _Campo1 + Llenar( FloatToStr(wDia), 2);
      if CDSFacturacion.Locate('Codigo', qryTemporalAux.AsString, []) then
      Begin
        CDSFacturacion.Edit;
        CDSFacturacion.FieldByName(_Campo1).Value := CDSFacturacion.FieldByName(_Campo1).Value + qryTemporalCant.Value;
        CDSFacturacion.Post;
      End;
      qryTemporal.Next;

pero no tengo ningun valor en los campos....
cuando trato de ver el valor del campo me sale null :confused::confused:

alguna sugerencia?

oscarac 19-05-2011 07:28:18

alguien me da una manito?

newtron 19-05-2011 10:03:52

Hola.

¿Has probado a ir parando el programa paso a paso a ver si va cogiendo los campos que se supone que deben de ser?

oscarac 19-05-2011 18:45:07

Cuando lo ejecuto paso a paso y quiero ver el valor por ejemplo de.


CDSFacturacion.FieldByName(_Campo1).Value := CDSFacturacion.FieldByName(_Campo1).Value + qryTemporalCant.Value;

qryTemporalCant.Value ...... me sale 1

CDSFacturacion.FielbbyName(_Campo1).value..... me sale Null
sim embargo _campo1 tiene como valor 'Desa11'
me he dado cuenta que cuando hago el append si graba pero no en el edit

newtron 19-05-2011 19:02:51

A ver si estás sumando un null con un número y por eso no te funciona bien.

oscarac 19-05-2011 20:06:52

Código Delphi [-]
if CDSFacturacion.Locate('Codigo', qryTemporalAux.AsString, []) then
      Begin
        CDSFacturacion.Edit;
        CDSFacturacion.FieldByName(_Campo1).Value := 1;
        CDSFacturacion.Post;
      End;

Cuando coloco asi la instruccion... me funciona bien... entonces en resumen... quiero acumular el campo "_campo"

alguien tiene conocimiento de como hacer? porque cuando coloco asi

Código Delphi [-]
 
if CDSFacturacion.Locate('Codigo', qryTemporalAux.AsString, []) then
      Begin
        CDSFacturacion.Edit;
        CDSFacturacion.FieldByName(_Campo1).Value := CDSFacturacion.FieldByName(_Campo1).Value + qryTemporalCant.Value;
        CDSFacturacion.Post;
      End;

no me funciona.... :(

oscarac 19-05-2011 20:30:50

Solucionado
 
saben como lo solucione?
simple
Código Delphi [-]
CDSFacturacion.FieldByName(_Campo1).AsFloat := CDSFacturacion.FieldByName(_Campo1).AsFloat + qryTemporalCant.Value;

loco no?:rolleyes::rolleyes:

newtron 20-05-2011 09:36:24

Entonces será seguramente lo que te decía, que el campo _campo1 tiene originalmente valor NULL y por eso no te suma. Yo esto lo soluciono cuando creo la base de datos le pongo 0 como valor por defecto a los campos numéricos y blancos a los de tipo caracter, de esta manera te ahorras estos problemas.

Saludos


La franja horaria es GMT +2. Ahora son las 16:10:58.

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