Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-11-2006
ygkw ygkw is offline
Miembro
 
Registrado: jun 2006
Posts: 15
Poder: 0
ygkw Va por buen camino
Exclamation Realizar un Locate en un Dataset que se encuentra en Edicion..

Hola muchachos, nuevamente los estoy visitando

Ayer estube trabajando con un DBGrid que se encuentra conectado a un TDataset por medio de un TDataSource y en el cual cargo los detalles de los comprobantes de venta, compra, etc.

Lo que he tratado de hacer es que cuando se este haciendo una nueva factura o comprobante (en modo de Insercion o Edicion) no pueda duplicar un mismo codigo de articulo en la grilla ya que mi tabla tiene el campo codigo como parte de la Clave Primaria y en el caso de que sea duplicado se posicione en el codigo que ya estaba anteriormente.

IMPORTANTE: LO QUE QUIERO CON ESTO ES QUE CUANDO SE INGRESE UN CODIGO QUE YA EXISTE, BUSQUE LA POSICION EN QUE ESTA EL CODIGO ANTERIOR Y QUE SE TRASLADE EL FOCO A LA FILA Y COLUMNA DEL CODIGO ANTERIOR. ASI SI EL OPERADOR DESEA AGREGAR MAS CANTIDAD DE UN PRODUCTO QUE YA HABIA CARGADO ANTERIORMENTE, DIRECTAMENTE SE POSICIONE EN LA COLUMNA DE LA CANTIDAD Y LA FILA DEL CODIGO ANTERIOR PARA EDITARLO MAS RAPIDAMENTE.

Para el tema de la deteccion de codigos duplicados estube buscando de que valide de alguna manera en el evento OnValidate del campo anticulo en el dataset, que no se esten duplicando los codigos mediante alguna funcion que valide el constraint de la DB para el PK el tiempo de ejecucion, deseado, sin enbargo no encontre informacion para eso.

Con respecto al tema de posicionar en la fila del codigo anterior surgio la idea de utilizar el locate en el dataset_detalle, lo interesante es que funciona a nivel del dataset, pero los datos no se reflejan correctamente en el dbgrid distorsionandolos.

Tambien probe una opcion interesante, que es la de manejar la tabla como un stringgrid, lo que me permite moverme correctamente a nivel de grilla pero que no se refleja en el Dataset.

Código Delphi [-]
begin  
with TStringGrid(DBGrid1) do    
  begin      
    Row:=VaribleFilaAnterior;//Fila en donde se encuentra el codigo anterior      
    Col:=3;  //Columna donde se modifica la cantidad del articulo.      
    SetFocus;
  end;
end;

Ojala que alguien tenga una idea de como hacer funcionar esto..

Saludos..
Responder Con Cita
  #2  
Antiguo 02-11-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
No repitas hilos, por favor.
Cuando tengas que modificar uno existente usa el botón de EDITAR (que supongo que es lo que ha pasado).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 02-11-2006
ygkw ygkw is offline
Miembro
 
Registrado: jun 2006
Posts: 15
Poder: 0
ygkw Va por buen camino
Lamento haber repetido los hilos, al tratar de editarlo porque no me funcionaba bien la etiqueta para el codigo de delphi, me apure en tratar de guardarlo y lo publique nuevamente sin querer..

Gracias por corregirlo..
Responder Con Cita
  #4  
Antiguo 02-11-2006
Rayku Rayku is offline
Miembro
 
Registrado: jun 2006
Posts: 12
Poder: 0
Rayku Va por buen camino
SUPONGAMOS Q TIENES UNA RELACION DE FACTURAS Y TU PRESIONAS EL BOTON MODIFICAR, UNA VEZ HECHO LO GRABAS, Y NECESITAS ACTULIZAR LOS DATOS EN TU GRID, Y UBICARTE EN EL MISMO REGISTRO

PASO 1 . GUARDAS EN VARIABLES AUXILIARES LOS DATOS NECESARIOS PARA UBICAR TU REGISTRO

PASO 2 Refrescar; (HACES LA CONSULTA Q REFRESQUE)

PASO 3 LOCALIZAS
ADOQuery.Locate('SerieNotaVenta;NroNotaVenta',VarArrayOf([Serie,NroFactura]),[loCaseInsensitive]);

OK SUERTE
Responder Con Cita
  #5  
Antiguo 02-11-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
No he leído el hilo al completo, pero estando en edición, si quieres saber un valor de otro registro, puedes usar el método LookUp del dataset, realiza la búsqueda sin modificar la posición actual.

Otra forma sería lanzar una consulta, pero es algo más laborioso, tú decides.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 02-11-2006
Rayku Rayku is offline
Miembro
 
Registrado: jun 2006
Posts: 12
Poder: 0
Rayku Va por buen camino
Si Funcionaria,

Disculpa Pero La Edicion La Haces Con Un Update Del Ado, O Por Consulta Sql?

Haz Una Edicion Por Sql, Y De Esa Manera Podras Usar El Locate, Filter, Incluso Recorrer El Ado Para Los Resultados Q Desees Y Luego Lanzar Tu Actualizacion Por Sql A Tu Tabla O Tablas Y Luego Refrescar Tus Datos Para Q Se Actualizen
Responder Con Cita
  #7  
Antiguo 02-11-2006
ygkw ygkw is offline
Miembro
 
Registrado: jun 2006
Posts: 15
Poder: 0
ygkw Va por buen camino
A lo que me refiero es que en mi dbgrid tengo las siguientes columnas:

codigo_articulo, descripcion_articulo, cantidad

Como la clave primaria de esta tabla esta formada por el campo codigo_articulo, el usuario al agregar nuevos registros a su venta o compra, no puede duplicar el mismo codigo!!

Por este motivo, cuando el usuario este haciendo una factura de de 20 registros en el detalle y sin querer vuelve a ingresar un codigo que ya lo habia ingresado anteriormente, el sistema quisiera que anule ese nuevo registro y se ubique en el registro anterior.

Ejemplo: Si en la 2da. linea del dbgrid el usuario ingreso el codigo 100 para una venta, y nuevamente durante la misma venta en el registro nro. 20 del dbgrid el operador vuelve a ingresar el codigo 100. En este caso el mismo codigo estara 2 veces lo que crea conflicto.

Mi intecion era que para este caso, se elimine la linea 20, y se traslade la posicion a la linea nro. 2 del dbgrid para que el operador modifique el campo de cantidad.

Espero que haya quedado un poco mas claro..

Saludos..
Responder Con Cita
  #8  
Antiguo 03-11-2006
Rayku Rayku is offline
Miembro
 
Registrado: jun 2006
Posts: 12
Poder: 0
Rayku Va por buen camino
Lo Que Debes De Hacer Es Q Antes De Que Ingrese Un Bien Deberias Verificar Si Ya Existe, Y Asi Controlar Que No Se Duplique, Ahora Te Recomiendo Que Cuando Ingreses Detalles Utilizaes Un String Grid Y Una Vez Hecho Hecho Registro Recien Graves Y Actualices
Responder Con Cita
  #9  
Antiguo 03-11-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Pues creo que lo tienes fácil:

En el evento BeforePost puedes guardar la cantidad de ese artículo en una variable temporal, hacer un lookup en esa tabla para saber si existe el código, si existe, haces lo que has comentado.

Una opción alternativa es preguntar al usuario si quiere sumar los artículos que ya ha introducido en la linea 20 a los existentes en la línea 2ª. Puesto que tienes en una variable temporal la cantidad de la línea 20 y en la BBDD almacenado, la línea 2, solo tienes que editar el registro y aumentar las cantidades.

Algo de código:
Código Delphi [-]

procedure BeforePost;
var cantidad :Variant;
     cantidad_a:integer; // la duplicada, la actual
begin
  cantidad := tabla.Lookup('codigo_articulo',tablacodigo_articulo.asInteger,'cantidad');
  if not VarisNull(cantidad) then
  cantidad_a :=  tablacantidad.Asinteger // guardamos la cantidad actual;
  codigo_a := tablacodigo_articulo.AsInteger; // guardamos el código
  if Application.Messagebox('Producto duplicado','¿Desea sumar la cantidad actual a la ya existente?',mb_iconquestion+ mbidyesno)= mbYes then
  begin
     query1.sql.text := 'update tabla set cantidad = ' inttostr(cantidad + cantidad_a) + 'where codigo_artículo = ' + inttostr(codigo_articulo);
   query1.Execsql;
  end;

Puede que tenga algunos errores, pero más o menos es así.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #10  
Antiguo 03-11-2006
ygkw ygkw is offline
Miembro
 
Registrado: jun 2006
Posts: 15
Poder: 0
ygkw Va por buen camino
Unhappy Ubicarse en el DBGrid cuando Valido un Campo en el Dataset

Si hubiera sido un stringrid hubiera sido facil, ya que moverse de un lado a otro, lo que queria es que cuando validara el codigo en el evento .., busque si encuentra un codigo igual anterior y directamente se traslade al registro anterior.

Ejemplo:

Código Delphi [-]
procedure TForm1.ClientDataSet1codigoArticuloValidate(Sender: TField);
begin
  for i:=0 to cantidad_de_registros do
  begin
    if (CodigoArticulo.Value = Array_con_codigos_anteriores[i]) then
    begin
      dbgrid1.col := i;   // i SERIA LA LINEA EN DONDE ESTA EL CODIGO 
                              //ANTERIOR.
      dbgrid1.row := 3; //COLUMNA DE LA CANTIDAD PARA EDITARLA
    end;
  end;
end;

ESTO ERA LO QUE BASICAMENTE QUERIA HACER, LA SOLUCION ES FACIL PERO COMO DIJE ANTES, CADA VEZ QUE REALIZA ESA RUTINA DISTORCIONA LOS VALORES DE LA TABLA..

SALUDOS Y GRACIAS POR EL APOYO...
Responder Con Cita
  #11  
Antiguo 03-11-2006
ygkw ygkw is offline
Miembro
 
Registrado: jun 2006
Posts: 15
Poder: 0
ygkw Va por buen camino
Rectifico algo, en el ultimo parrafo, Distorciona los valores en el DBGrid, la tabla no tiene nada que ver..

Exitos mis amigos..
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
Copiar el contenido de un DataSet a otro DataSet Javi2 Varios 82 22-11-2022 09:26:16
Porque no la encuentra? Migpal OOP 3 21-09-2005 23:32:52
Encuentra los 5 (o mas) errores... papulo Varios 10 16-09-2005 09:10:05
Como puedo cambiar la propiedad de edicion y no edicion a un StringGrid1 ctronx Varios 2 25-06-2004 23:10:19


La franja horaria es GMT +2. Ahora son las 04:10: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