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 10-02-2010
_CALI _CALI is offline
Miembro
 
Registrado: mar 2008
Posts: 99
Poder: 17
_CALI Va por buen camino
Smile consulta sobre cabecera y detalle (facturas)!!!

Hola amigos un gusto como siempre!!!

quisiera ayuda en lo siguiente:

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!!
Responder Con Cita
  #2  
Antiguo 10-02-2010
Avatar de heroe
heroe heroe is offline
Miembro
 
Registrado: may 2006
Ubicación: Cartago, Costa Rica
Posts: 45
Poder: 0
heroe Va por buen camino
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;
Responder Con Cita
  #3  
Antiguo 10-02-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #4  
Antiguo 10-02-2010
_CALI _CALI is offline
Miembro
 
Registrado: mar 2008
Posts: 99
Poder: 17
_CALI Va por buen camino
Smile muchas gracias por responder

Cita:
Empezado por Caro Ver Mensaje
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
Responder Con Cita
  #5  
Antiguo 11-02-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por _CALI Ver Mensaje
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #6  
Antiguo 11-02-2010
_CALI _CALI is offline
Miembro
 
Registrado: mar 2008
Posts: 99
Poder: 17
_CALI Va por buen camino
.

Cita:
Empezado por Caro Ver Mensaje
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!!!
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
Cabecera->Detalle martindebiasi Internet 0 20-02-2008 21:37:01
Como registar una cabecera y el detalle de una factura, en una sola transaccion? sarroyab MySQL 2 02-08-2007 20:14:24
Consulta sobre maestro detalle ilichhernandez Conexión con bases de datos 0 18-05-2007 19:13:06
Sugerencias sobre numeracion de facturas JoanKa Varios 23 04-01-2007 17:07:53
No puedo imprimir cabecera de detalle con Qreport juanma072 Impresión 4 22-10-2004 18:29:37


La franja horaria es GMT +2. Ahora son las 08:56:26.


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