Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   consulta sobre cabecera y detalle (facturas)!!! (https://www.clubdelphi.com/foros/showthread.php?t=66269)

_CALI 10-02-2010 16:57:48

consulta sobre cabecera y detalle (facturas)!!!
 
Hola amigos un gusto como siempre!!!

quisiera ayuda en lo siguiente:confused::

estoy haciendo una factura como es obvio uso una tabla de cabezera y otra de detalle, la tabla de detalle la relaciono con un TClientDataset y la verdad no se como hacer para no ingresar prodcutos repetidos en mi detalle ni tampoco no se como generar los items uno seguido del otro, mi Tabla detalle es un TClientDataSet, antes usaba una tabla normal y me era facil porue generaba consultas SQL para saber si ya ingrese el producto y generar el Item, como el detalle es un ClienteDataSet esta con CahedUpdates y no se guarda ninguna informacion a mi base hasta q ejecute mi trasaccion, por eso no puedo ahora usar consultas,

ojala me haya exlicado bien

Muchas Gracias ante todo

Saludos!!

heroe 10-02-2010 19:47:20

Reccorer TClientDataSet
 
Para trabajar con un TClientDataSet, debes recorrerlo registro por registro, y verificando manualmente.

Ejemplo:

Código Delphi [-]
procedure RecorrerDataSet(cs: TClientDataSet);
var
begin
  with cs do
  begin
    Active := True;
    First;
    while not Eof do
    begin
      //Tu codigo   
      Next;
    end
    Active := False;
  end;
end;

Nota:
Tu codigo de comparación para no meter repetidos puede ser

Código:

if cs.FieldByName('Codigo').AsString <> NuevoCodigo then
begin
  cs.Append;
  cs.FieldByName('Codigo').AsString := NuevoCodigo;
  cs.Post;
end;


Caro 10-02-2010 20:16:35

Hola _CALI, como bien dices tu no puedes hacer consultas porque todavía no esta grabado en la BD, pero si tienes esos registros en el ClientDataSet. Puedes utilizar la función Locate del ClientDataSet para buscar si ya existe.

Código Delphi [-]
 if ClientDataSet1.Locate('campo', Edit1.Text, [loCaseInsensitive]) then
   showmessage('Existe el producto');

No entiendo a que te refieres uno seguido de otro, ¿como estas grabando los registros? ¿donde quieres que aparezcan tus items uno seguido de otro?.

Saluditos

_CALI 10-02-2010 21:32:44

muchas gracias por responder
 
Cita:

Empezado por Caro (Mensaje 353598)
Hola _CALI, como bien dices tu no puedes hacer consultas porque todavía no esta grabado en la BD, pero si tienes esos registros en el ClientDataSet. Puedes utilizar la función Locate del ClientDataSet para buscar si ya existe.

Código Delphi [-] if ClientDataSet1.Locate('campo', Edit1.Text, [loCaseInsensitive]) then showmessage('Existe el producto');


No entiendo a que te refieres uno seguido de otro, ¿como estas grabando los registros? ¿donde quieres que aparezcan tus items uno seguido de otro?.

Saluditos


gracias por responder!!!

me refiero a los item al nro de linea que voy ingresando al detalle
ejm:
01
02
03
---
nLinea

//************

por otro lado yo quiero ingrsar los datos directamente en la grilla,
en que evento del campo coloco el locate o hago el rrecorrido????



Gracias denuevo

Caro 11-02-2010 03:53:45

Cita:

Empezado por _CALI (Mensaje 353605)
gracias por responder!!!

me refiero a los item al nro de linea que voy ingresando al detalle
ejm:
01
02
03
---
nLinea

//************

por otro lado yo quiero ingrsar los datos directamente en la grilla,
en que evento del campo coloco el locate o hago el rrecorrido????



Gracias denuevo

Hola de nuevo Cali, si ingresas directamente los datos en el DBGrid, tienes que hacer muchos controles. El evento que debes utilizar es el OnBeforePost del CLientDataSet, que se da antes de hacer el Post, pero si pones el Locate o el recorrido de la tabla sobre ese ClientDataSet dentro de ese evento, vas a tener problemas, como no se ha hecho el Post todavía va entrar en un ciclo hasta que te de un mensaje de Stack Overflow. Lo que se me ocurre para solucionar eso, es que hagas un clon de tu ClientDataset y hacer la busqueda ahí, tu codigo quedaría así:

Código Delphi [-]
procedure TForm1.ClientDataSet1BeforePost(DataSet: TDataSet);
var
 ClientDataSetAux : TClientDataSet;
begin
 Try
  ClientDataSetAux := TClientDataSet.Create(Nil);
  //Clonamos el ClientDataSet
  ClientDataSetAux.CloneCursor(ClientDataSet1, True);
 
  if dataSet.State = dsInsert then
   if ClientDataSetAux.Locate('campo', DataSet.fieldbyname('campo').AsString, [loCaseInsensitive]) then
    begin
     //En este ejemplo estamos cancelando el insert
     DataSet.Cancel;
     Abort;
    end;
  Finally
   FreeAndNil(ClientDataSetAux);
  end;
end;

Para que insertes al final utiliza ClientDataSet1.Append

Saluditos

_CALI 11-02-2010 17:57:14

.
 
Cita:

Empezado por Caro (Mensaje 353637)
Hola de nuevo Cali, si ingresas directamente los datos en el DBGrid, tienes que hacer muchos controles. El evento que debes utilizar es el OnBeforePost del CLientDataSet, que se da antes de hacer el Post, pero si pones el Locate o el recorrido de la tabla sobre ese ClientDataSet dentro de ese evento, vas a tener problemas, como no se ha hecho el Post todavía va entrar en un ciclo hasta que te de un mensaje de Stack Overflow. Lo que se me ocurre para solucionar eso, es que hagas un clon de tu ClientDataset y hacer la busqueda ahí, tu codigo quedaría así:


Código Delphi [-]
procedure TForm1.ClientDataSet1BeforePost(DataSet: TDataSet);
var
ClientDataSetAux : TClientDataSet;
begin
Try
ClientDataSetAux := TClientDataSet.Create(Nil);
//Clonamos el ClientDataSet
ClientDataSetAux.CloneCursor(ClientDataSet1, True);

if dataSet.State = dsInsert then
if ClientDataSetAux.Locate('campo', DataSet.fieldbyname('campo').AsString, [loCaseInsensitive]) then
begin
//En este ejemplo estamos cancelando el insert
DataSet.Cancel;
Abort;
end;
Finally
FreeAndNil(ClientDataSetAux);
end;
end;





Para que insertes al final utiliza ClientDataSet1.Append

Saluditos





algo me parecia, Perfecto amigo muchas grcias!!!


La franja horaria es GMT +2. Ahora son las 18:19:45.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi