Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Actualizar datos de un StringGrid desde DB

Buenas a todos.
como verán no suelo postear mucho por que con la info que hay en ClubDelphi creo que no es necesário hacerlo ya que está "casi" todo lo que uno necesita para poder realizar "casi" cualquier cosa, estoy aprendiendo muchísimo gracias a este foro y a sus foreros que siempre me han ayudado hasta el momento ( saludos Caral, Lepe, Roman.. y alguno que se me escapa ) que me resolvieron las dudas hasta el momento.. pero bueno al grano xDD

Resulta que estoy haciendo un sistema de facturación y ahora estoy en la parte de ventas, que es donde mas problemas he tenido y los superé como dije gracias al foro.. pero ahora este problema que tengo ahora me mata!!!
No pude resolverlo es mas. creo que parte de mi por no saber plantearme bién que es lo que necesito o COMO necesito hacerlo.

Bueno lo que quiero hacer es ACTUALIZAR una COLUMNA de un StringGrid con datos de una DB ( MySQL ) que conecto con ZEOS
no tengo problemas para insertar datos.. eliminarlos, etc.

Ahora el problema es que para los que estoy haciendo el programa manejan 6 Precios diferentes de cada producto que se los agrega el momento de agregar el respectivo producto o "Item", bueno ahora cada cliente el momento de darle de alta se le asigna una lista de precio ( cualquiera de los precios )

Ya hasta este punto bién.. ahora lo que pretengo hacer es lo siguiente.

CUando abro el módulo ventas lo primero que me sale es esto
(si, si ya se que está feo pero quiero que sea funcinal xD )

[img=http://img187.imageshack.us/img187/4128/preciosow0.th.jpg]

ahora cuando busco un cliente tiene que cambiar el ComboBox que ven a la derecha el que está encerrado con en un óvalo

Bueno luego de eso comienzo la búqueda del producto por código de producto o código de barras lo encuentro y lo agrego el StringGrid
OJO.- el precio lo toma desde el ComboBox según el número que esté

Bueno y todo lo demás sin problemas.. pero ahora que pasaría si el Cliente quiere que le den con la lista de precio 4 ( precio4 ) por ej y siendo que el tenía la lista de precio 3 ( precio3 ) pues si como se lo imaginaban.. hay que precionar el botón LIMPIAR TODO y comensar a agregar de nuevo con la nueva lista de precios escojida en el ComboBOx perooooooooo como se darán cuenta es una pérdida de tiempo y además el programa no sería efisciente.. daría malos ratos al que lo usa y no me gusta eso, si hago algo lo quiero hacer bién.

Ya ahora lo quiera es que el que usa la app pueda cambiar el item en el COmboBox y automaticamente se ACTUALIZEN TODOS los precios de la respectiva columna

Pero no se como hacer..
Por el momento lo que analicé es hacer con una consulta SQL a la tabla Productos de mi Base de Datos.

TABLA PRODUCTOS.

Código SQL [-]
CREATE TABLE `productos` (
  `ID_producto` int(10) unsigned NOT NULL auto_increment,
  `CodProducto` varchar(10) NOT NULL,
  `CodigoBarra` varchar(15) NOT NULL default '0',
  `Descripcion` varchar(30) NOT NULL default '',
  `Categoria` varchar(20) NOT NULL default '',
  `SubCategoria` varchar(20) NOT NULL default '',
  `Unidad` varchar(5) NOT NULL,
  `Cantidad` int(11) NOT NULL default '0',
  `Proveedor` varchar(20) NOT NULL default '',
  `UnidadPrecio` varchar(5) NOT NULL default '',
  `PrecioCompraBs` float default '0',
  `PrecioCompraSus` float default '0',
  `Costo` float default '0',
  `Precio1` float NOT NULL default '0',
  `Precio2` float default NULL,
  `Precio3` float default NULL,
  `Precio4` float default NULL,
  `Precio5` float default NULL,
  `Precio6` float default NULL,
  `FechaActualizacion` date NOT NULL default '0000-00-00',
  PRIMARY KEY  (`ID_producto`),
  UNIQUE KEY `CodProducto` (`CodProducto`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1


luego de eso pensé primer lugar en buscar el producto ya sea por codProducto o por CodigoBarra que si o si tienen que tenerlo una ves encontrado el producto de la primera columna ( vamos la horizontal, estoy tan confundido que no recuerdo cual es fila y columna en el StringGrid )
una ves buscaod el producto por codproducto o codigobarra y buscar el campo precio pienso que sería una variable que contenga de acuerdo al ComboBox el respectivo precio ( precio1, precio2,.... )
Luego de eso una ves encontrado el producto por su código y su campo precio con la variable precio hacer que ACTUALIZE el precio que tiene insertado en el StringGrid... por ej si estaba un producto:

SIlla de madera precio1

que me lo actualice a :

Silla de madera precio2 ( dependiendo de que items tengan en el ComboBox )

y eso hacer con tooooodos los productos que tenga en el StringGrid


Bueno se que sería con unos 2 bucles pero vamos.. soy pura teoría que no se como hacerlo

ajunto una chapucera que intenté pero se que está mal xDD
por lo menos intenté

Código Delphi [-]
procedure TFrmVentas.CBListaPrecioChange(Sender: TObject);
var
  i : Integer;
  Precio : String;
begin
  DM.ZQAgregarItems.Close;
  DM.ZQAgregarItems.SQL.Text := 'Select * FROM productos';
  DM.ZQAgregarItems.Open;

  case CBListaPrecio.ItemIndex of
    0:Precio := DM.ZQAgregarItems.FieldByName('Precio1').Value;
    1:Precio := DM.ZQAgregarItems.FieldByName('Precio2').Value;
    2:Precio := DM.ZQAgregarItems.FieldByName('Precio3').Value;
    3:Precio := DM.ZQAgregarItems.FieldByName('Precio4').Value;
    4:Precio := DM.ZQAgregarItems.FieldByName('Precio5').Value;
    5:Precio := DM.ZQAgregarItems.FieldByName('Precio6').Value;
  end;

For i:=0 to  SGListaProductos.RowCount-1 Do
Begin
    DM.ZQActualizaListaPrecio.Close;
    DM.ZQActualizaListaPrecio.SQL.Clear;
    DM.ZQActualizaListaPrecio.SQL.Add('SELECT recio FROM productos');
    DM.ZQActualizaListaPrecio.SQL.Add('Where CodProducto = :codigo');
    DM.ZQActualizaListaPrecio.ParamByName('precio').AsString := Precio;
    DM.ZQActualizaListaPrecio.ParamByName('codigo').AsInteger  := StrToInt(SGListaProductos.Cells[3,i]);
    DM.ZQActualizaListaPrecio.Open;
End;

Bueno eso lo puse en el evento OnChange del CBListaPrecio que así se llama el ComboBox que dependen de el las listas de precios,
Bueno que datos mas ??

Pues uso un query para agregar los items ahí que se llama
ZQAgregarItems

el código que uso para agregar los items es el siguiente por si a alguien le sirve..

AGREGAR ITEMS A STRINGGRID DESDE BASE DE DATOS MySQL

Código Delphi [-]
if (CBListaPrecio.Text <> '') then
  begin

  FrmAgregarItems := TFrmAgregarItems.Create(self);

   try
      FrmAgregarItems.ShowModal;
   finally
      If FrmAgregarItems.Cancela = False then
      Begin
         If Cuenta > 1 then SGListaProductos.RowCount := SGListaProductos.RowCount + 1;
          SGListaProductos.Cells[1,cuenta] := FrmAgregarItems.ECantidad.Text;
          SGListaProductos.Cells[2,cuenta] := DM.ZQAgregarItems.FieldByName('unidad').AsString;
          SGListaProductos.Cells[3,cuenta] := DM.ZQAgregarItems.FieldByName('codproducto').AsString;
          SGListaProductos.Cells[4,cuenta] := DM.ZQAgregarItems.FieldByName('codigobarra').AsString;
          SGListaProductos.Cells[5,cuenta] := DM.ZQAgregarItems.FieldByName('descripcion').AsString;
          SGListaProductos.Cells[6,cuenta] := DM.ZQAgregarItems.FieldByName('unidadprecio').AsString;
          case CBListaPrecio.ItemIndex of
            0:Precio := DM.ZQAgregarItems.FieldByName('Precio1').Value;
            1:Precio := DM.ZQAgregarItems.FieldByName('Precio2').Value;
            2:Precio := DM.ZQAgregarItems.FieldByName('Precio3').Value;
            3:Precio := DM.ZQAgregarItems.FieldByName('Precio4').Value;
            4:Precio := DM.ZQAgregarItems.FieldByName('Precio5').Value;
            5:Precio := DM.ZQAgregarItems.FieldByName('Precio6').Value;
          end;
          SGListaProductos.Cells[7,cuenta] := Precio; //DM.ZQAgregarItems.FieldByName('precio1').AsString;
          SGListaProductos.Cells[8,cuenta] := Format('%8.2f',[StrToFloat(Precio) * StrToFloat(SGListaProductos.Cells[1,cuenta])]);
    
          Cuenta := Cuenta +1;
          SortGrid(SGListaProductos,0,0);
          CalculaTotales;
      end;
      FrmAgregarItems.Free;
   end;
end;

Bueno creo que he sido muy claro en mi duda..

saludos y gracias por adelantado foreros.. y disculpen por aumentar el tamaño de su DB del foro xDD

salud!!!

Última edición por BlackDaemon fecha: 21-03-2007 a las 06:20:28.
Responder Con Cita
  #2  
Antiguo 21-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Pues si, has sido muy claro y conciso .

Creo que vas bien. La SQL que necesitas para actualizar el precio según la lista elegida sería:
Código Delphi [-]
For i:=0 to  SGListaProductos.RowCount-1 Do
Begin
    DM.ZQActualizaListaPrecio.SQL.Add('UPDATE productos');
    DM.ZQActualizaListaPrecio.SQL.Add(' SET Precio = :precio');
    DM.ZQActualizaListaPrecio.SQL.Add('Where CodProducto = :codigo');
    DM.ZQActualizaListaPrecio.ParamByName('precio').AsCurrency:= strToCur(Precio);
    DM.ZQActualizaListaPrecio.ParamByName('codigo').AsInteger  := StrToInt(SGListaProductos.Cells[3,i]);
DM.ZQActualizaListaPrecio.ExecSql; // ejecutamos la consulta.
end;

Aunque yo, en lugar de guardar los 4 precios en la tabla productos, hubiera creado una nueva tabla llamada tarifas, donde a cada producto le pondría los precios:
tabla tarifas:
Código:
codProducto       Tipo_Tarifa          Precio
     21            Precio_Bajo      10 €
     21            Precio_Medio     15 €
     21            Precio_Alto      30 €
     1             Precio_Bajo      10 €
     1             Precio_Alto      30 €
La clave primaria la conformaría los dos primeros campos, de esa forma no se permitirían inchoherencias (poner 2 precios a un mismo producto con el mismo Tipo_Tarifa).

Después, para presentar la lista en el combo haría algo así:
Código SQL [-]
select * from tarifas where codigo = 1

En el combo podría presentar el campo Tipo_Tarifa, y el usuario elije la que quiere aplicar.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 21-03-2007 a las 12:13:15.
Responder Con Cita
  #3  
Antiguo 21-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola lepe... muy interesante y clara tu respuesta y muchas gracias por dármela.
Pero hay un problema. creo que me expliqué un poco mal o entendiste un poco mal.
la cosa va asi.. tu me das este código :

Código Delphi [-]
For i:=0 to  SGListaProductos.RowCount-1 Do
Begin
    DM.ZQActualizaListaPrecio.SQL.Add('UPDATE productos');
    DM.ZQActualizaListaPrecio.SQL.Add(' SET Precio = recio');
    DM.ZQActualizaListaPrecio.SQL.Add('Where CodProducto = :codigo');
    DM.ZQActualizaListaPrecio.ParamByName('precio').AsCurrency:= strToCur(Precio);
    DM.ZQActualizaListaPrecio.ParamByName('codigo').AsInteger  := StrToInt(SGListaProductos.Cells[3,i]);
DM.ZQActualizaListaPrecio.ExecSql; // ejecutamos la consulta.
end;

el cual con el UPDATE lo que haría escribir en mi base de datos y por el momento NO necesito eso.. creo que eso tendría que ir en la parte final cual el usuario precioa un botón, por ej: EJECUTAR o VENDER como sea y que descuente las cantidades ... osea osar ese pedaso de código para UPDATEAR las CANTIDADES no los precios.. por que para podificar los precios está otro Form donde también pueden modificar el nombre, código de barra, descripción, etc.

Bueno y lo que yo necesito solo es ACTUALIZAR la mi STRINGGRID con otros precios de mi TABLA

espero ahora haber podío ser mas claro.

AHora respecto al otro punto.. me parece una exelente idéa de hacer una nueva tabla para los precios.. por que me será mas fácil manejar ya que son 6 precios , ya suponiendo que tengo mi NUeva tabla TARIFAS y podría hacer lo que me dices.
Hacer un SELECT peroooooooo lo que no entiendo es que como hacer para saber el código del producto.. osea buscar el el producto que está en el StringGrid luego hacer el select, escojer el nuevo precio de acuerdo al COmboBox y reemplazar al que está en el StringGrid, eso hacer para toda la lista del StringGrid supongo que es con un bucle pero no me doy idea de como mesclar las 2 consultas.. me refiero a una BUSCA PRODUCTO POR CODIGO , una ves encontrado BUSCA PRECIO DE ACUERDO AL COMBOBOX, una ves que tengo el nuevo precio REEMPLAZARLO AL PRECIO QUE TENGO EN EL STRINGGRID

Bueno por el momento estaré haciendo la nueva tabla con los precios

saludos y gracias Lepe tus respuestas siempre me ayudan

salud!!
Responder Con Cita
  #4  
Antiguo 21-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En el stringGrid tienes la columna 3 con el código del producto. Teniendo la tabla tarifas, te sale más fácil, ya que en esa tabla tienes el código del producto y el tipo de tarifa:

Código Delphi [-]
    DM.ZQActualizaListaPrecio.Close;
    DM.ZQActualizaListaPrecio.SQL.Clear;
    DM.ZQActualizaListaPrecio.SQL.Add('SELECT precio FROM Tarifas');
    DM.ZQActualizaListaPrecio.SQL.Add('Where CodProducto = :codigo');
    DM.ZQActualizaListaPrecio.SQL.Add('and Tipo_Tarifa = :Tarifa');
    DM.ZQActualizaListaPrecio.prepare;

with DM.ZQActualizaListaPrecio DO
For i:=0 to  SGListaProductos.RowCount-1 Do
Begin
  ParamByName('codigo').AsInteger  := StrToInt(SGListaProductos.Cells[3,i]);
  ParamByName('Tarifa').AsString = combobox1.items[combobox1.Itemindex];
  Open; // abrimos la consulta
   if not IsEmpty then

      SGListaProductos.Cells[7,i] := Fieldbyname('Precio').AsString; 
  //solo debería existir un registro para esta tarifa y este producto.
   else
   begin
     ShowMessage('No existe El tipo de tarifa para el producto' + StrToInt(SGListaProductos.Cells[3,i]));
     SGListaProductos.Cells[7,i] := '<< Error >>';
  end;  
  Close; // cerramos la consulta para la próxima iteración del bucle.   
End;

Edito:
Como ahora el usuario es el que creará los "tipos de tarifas", en el combobox1 (el combo de precios) tendrás que cargarlo dinámicamente, por ejemplo al crear la ventana, usando un TZQuery convenientemente preparado:
Código SQL [-]
 select distinct Tipo_Tarifa from Tarifas
y ya en el Oncreate de la ventana:
Código Delphi [-]
qryTiposTarifas.Open;
Combobox1.items.Clear;
qryTiposTarifas.DisableControls; // agilizar las iteraciones por la consulta.
combobox1.items.BeginUpdate;  // agilizar las adiciones al combo.
while not qryTiposTarifas.eof do
begin
  Combobox1.Items.Add(qrytiposTarifas.Fields[0].AsString;
  qryTiposTarifas.Next;
end;

qryTiposTarifas.Close;
qryTiposTarifas.EnableControls; // dejar las cosas como estaban.
combobox1.Items.EndUpdate;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 21-03-2007 a las 18:02:59.
Responder Con Cita
  #5  
Antiguo 21-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
jojojo ahora si creo que esto es lo que necesitaba Lepe

bueno en este mismo momento estoy probando el código
de 10 minutos te digo el resultado.. se que este post no tiene sentido pero te agradesco por tu respuesta

saludos pues !!
Responder Con Cita
  #6  
Antiguo 22-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Bueno pues.. he estado toda la tarde en esto y lo que avancé fue hacer la tabla respectiva para los precios.. ya que manejan 6 precios distintos hice mi tabla de esta manera.. agregué un campo para Código de Barras.. por que con el tiempo creo que se manejarán así todo.

TABLA DE TARIFAS

Código SQL [-]
CREATE TABLE `tarifas` (
  `CodigoBarra` varchar(20) NOT NULL,
  `CodProducto` varchar(20) NOT NULL,
  `TipoTarifa` varchar(20) NOT NULL,
  `Precio` double NOT NULL,
  KEY `CodigoBarra` (`CodigoBarra`),
  KEY `CodProducto` (`CodProducto`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Bueno una ves creeada la tabla tuve que modificar la parte de AGREGAR PRODUCTOS .. donde antes ahí se ponían los precios y era con una simple tabla de conectar unos DBEdits a cada campo de la tabla PRODUCTOS.. los DBEdits correspondían a cada precio.. osea eran 6.
Ahora.. los precios los agrego de esta forma..
A mi parecer esta una chapucera.. por que soy nuevo en esto pero me andá bién y eso me hace sentir bién.. pero creo que se podría mejorar..
Aquí les dejo el código del botón que agrega los los precios en la nueva TABLA

Código Delphi [-]
procedure TFrmAgregarProductos.SBGuardarClick(Sender: TObject);
begin
with DM.ZQPrecios do
begin
  Close;
  SQL.Clear;

  SQL.Add('INSERT INTO `tarifas` ( `CodigoBarra` , `CodProducto` , `TipoTarifa` , `Precio` )');
  SQL.Add('VALUES (:CB, :CP, :TT1, :P1), ');
  SQL.Add('(:CB, :CP, :TT2, :P2), ');
  SQL.Add('(:CB, :CP, :TT3, :P3), ');
  SQL.Add('(:CB, :CP, :TT4, :P4), ');
  SQL.Add('(:CB, :CP, :TT5, :P5), ');
  SQL.Add('(:CB, :CP, :TT6, :P6)');

  // Si, asignamos los parámetros xDD
  ParamByName('CB').AsString := ECodigoBarra.Text;
  ParamByName('CP').AsString := ECodProducto.Text;
  ParamByName('TT1').AsString := 'Precio1';
  ParamByName('TT2').AsString := 'Precio2';
  ParamByName('TT3').AsString := 'Precio3';
  ParamByName('TT4').AsString := 'Precio4';
  ParamByName('TT5').AsString := 'Precio5';
  ParamByName('TT6').AsString := 'Precio6';

  ParamByName('P1').AsString := EPrecio1.Text;
  ParamByName('P2').AsString := EPrecio2.Text;
  ParamByName('P3').AsString := EPrecio3.Text;
  ParamByName('P4').AsString := EPrecio4.Text;
  ParamByName('P5').AsString := EPrecio5.Text;
  ParamByName('P6').AsString := EPrecio6.Text;
  // Ejecutamos e insertamos todos los valores asignados
  ExecSQL;

end;

  DM.ZTAlmacen.Post; -->  Este agrega las demas descripciones pero a la tabla PRODUCTOS.. lo de arriba a la nueva tabla TARIFAS

end;

Bueno.. esa parte ya la arreglé con eso.. PERO tengo unas dudas ahora.. cuando se realize una búqueda de un producto y quiero que me lo muestre en un DBGrid como lo tendría que hacer ?? por ej

Código SQL [-]
SELECT * FROM productos WHERE codproducto = :codigo

Bueno en primer lugar no tendré para hacer búsquedas por Código de producto ni por Codigo de barras.. por que ya esos datos los guardo en otra tabla.. ahora podría buscar por CATEGORIA o DESCRIPCION del produto.. peroooo ya no me mostraría el codigo de barras, código de producto NI los precios :S por que estarán en otra tabla.
Y si realizo la búsqueda en la tabla TARIFAS, ahí podré buscar por códigos pero tampoco me mostrarán las descripciones ni las cantidades disponibles que eso se guarda en la TABLA productos.. en fin son dudas que tengo y que con eso ya se fregó gran parte de mi programa.. pero si es por el BIEN estoy de acuerdo en solucionar esas partes ... de las búsquedas etc.
o para hacer las búsquedas tendría que llamar a las 2 TABLAS ?? a la PRODUCTOS y TARIFAS ?? como sería eso son SQL ?

Código SQL [-]
SELECT * FROM productos, tarifas

si es así no habrá problemas..

Ahora seguiré probando el código para actualizar toda la fila de PRECIOS

pero hasta el momento como voy ?? está bién lo que hago ??

ahh una cosa mas.. que he estado pensando cuando uno agrega un producto indicas que si es Und, Pza, Doc == Unidad, Pieza, Docena
bueno eso donde cumple su función sería a la hora de agregar los produtos al StringGrid verdad ?? si es Docena pues multiplicar el precio de la Unidad por 12 supongo.. pero creo que mes estoy pasando a otro punto, pero igual quería saber por si puedo hacer algo ahora o eso luego.

bueno saludos

salud!!

Última edición por BlackDaemon fecha: 22-03-2007 a las 01:56:53.
Responder Con Cita
  #7  
Antiguo 22-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Bueno pues el motivo de este post es el siguiente.. dejando aparte el anterior problema .. que ya estoy por sulicionarlo pero al solucionar ese surgieron muchos problemas mas.. bueno para mi
el primero es este.

http://img301.imageshack.us/img301/8...oductosfu0.jpg

como podrán ver antes usaba esos DBEdits que estaban enlasados a cada campo de mi TABLA PRODUCTOS pero ahora agregué esos Edits normales para hacer la inserción de los precios en la tabla nueva TARIFAS.. que lo hago sin problemas.. pero antes cuando hacian clic en el botón NET o PRIOR, LAST, etc.. este recorria la TTable y se visualizaban en los DBEdits para así poder EDITAR o ELIMINAR.. pero ahora como los EDITS normales no están enlasados a ninguna TABLA no es posible hacer eso.. y quedan con el TEXTO que se le escribe la primera vés que uno hace un registro..
además que cuando elimino con TTable.delete; no me borrará de la tabla TARIFAS los precios correspondientes a esa descripción..ya que no estarán en la mis TABLA.. bueno es un problema grave para mi por que no se como resolverlo.. y si no lo resulevo eso no puedo pasar el otro punto de mi problema que es el primer post de este tema.

Aquí les pongo el código con el que registraba un nuevo producto.

Código Delphi [-]
procedure TFrmAgregarProductos.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  FrmAgregarProductos := nil;
  Action := caFree;
  FrmAgregarProductos.Free;
end;

procedure TFrmAgregarProductos.SBNuevoClick(Sender: TObject);
begin
  modoEditar(True);
  DM.ZTAlmacen.Append;
  DBECodigoProducto.SetFocus;
  DateTimePicker1.DateTime := Now;
  DateTimePicker1.BringToFront;
end;

procedure TFrmAgregarProductos.SBEditarClick(Sender: TObject);
begin
  DM.ZTAlmacen.Edit;
  modoEditar(True);
  DBECodigoProducto.SetFocus;
end;

procedure TFrmAgregarProductos.SBGuardarClick(Sender: TObject);
begin
  with DM.ZQTarifas do
  begin
    Close;
    SQL.Clear;
    SQL.Add('INSERT INTO `tarifas` ( `CodigoBarra` , `CodProducto` , `TipoTarifa` , `Precio` )');
    SQL.Add('VALUES (:CB, :CP, :TT1, :P1), ');
    SQL.Add('(:CB, :CP, :TT2, :P2), ');
    SQL.Add('(:CB, :CP, :TT3, :P3), ');
    SQL.Add('(:CB, :CP, :TT4, :P4), ');
    SQL.Add('(:CB, :CP, :TT5, :P5), ');
    SQL.Add('(:CB, :CP, :TT6, :P6)');

    // Si, asignamos los parámetros xDD
    ParamByName('CB').AsString := ECodigoBarra.Text;
    ParamByName('CP').AsString := ECodProducto.Text;
    ParamByName('TT1').AsString := 'Precio1';
    ParamByName('TT2').AsString := 'Precio2';
    ParamByName('TT3').AsString := 'Precio3';
    ParamByName('TT4').AsString := 'Precio4';
    ParamByName('TT5').AsString := 'Precio5';
    ParamByName('TT6').AsString := 'Precio6';

    ParamByName('P1').AsString := EPrecio1.Text;
    ParamByName('P2').AsString := EPrecio2.Text;
    ParamByName('P3').AsString := EPrecio3.Text;
    ParamByName('P4').AsString := EPrecio4.Text;
    ParamByName('P5').AsString := EPrecio5.Text;
    ParamByName('P6').AsString := EPrecio6.Text;
    // Ejecutamos e insertamos todos los valores asignados
    ExecSQL;

  end;
  DM.ZTAlmacen.FieldByName('FechaActualizacion').AsDateTime := DateTimePicker1.Date;
  DM.ZTAlmacen.Post;
  ModoEditar(False);
end;

procedure TFrmAgregarProductos.SBEliminarClick(Sender: TObject);
var
  resp : Integer;
begin
  if Editando then begin
    DM.ZTAlmacen.Cancel;
    modoEditar(False);
  end
  else begin
    resp := Application.MessageBox(Pchar('¿Desea eliminar el código '+DBECodigoProducto.Text+'?'),'Eliminar un registro',MB_YESNO+MB_ICONERROR);
    if resp = ID_YES then begin
      DM.ZTAlmacen.Delete;
      modoEditar(False);
    end;
  end;
end;

procedure TFrmAgregarProductos.FormShow(Sender: TObject);
begin
  try
    DM.ZTUnidad.Active := True;
    DM.ZTUnidadPrecio.Active := True;
    DM.ZTAlmacen.Active := True;
    DM.ZTProveedores.Active := True;
    DM.ZTCategorias.Active := True;
    DM.ZTSubCategorias.Active := True;
  except
    Application.MessageBox(Pchar('Error de conexión a la base de datos:'+#13+#13+'Verifique si la ruta es correcta'),'Error de conexión',MB_ICONWARNING);
    Application.Terminate;
  end;
  ModoEditar(False);
end;

procedure TFrmAgregarProductos.SBPrimeroClick(Sender: TObject);
begin
  DM.ZTAlmacen.First;
end;

procedure TFrmAgregarProductos.SBAnteriorClick(Sender: TObject);
begin
  DM.ZTAlmacen.Prior;
end;

procedure TFrmAgregarProductos.SBSiguienteClick(Sender: TObject);
begin
  DM.ZTAlmacen.Next;
end;

procedure TFrmAgregarProductos.SBUltimoClick(Sender: TObject);
begin
  DM.ZTAlmacen.Last;
end;

procedure TFrmAgregarProductos.DBEPrecio1KeyPress(Sender: TObject;
  var Key: Char);
var precio : Integer;
begin
  if Key = #13 then begin
    Key := #0; //quitamos el sonido
    precio := (StrToInt(DBEPrecio1.Text) * 16 Div 100 + StrToInt(DBEPrecio1.Text));
    DBEPrecio2.Text := IntToStr(precio);
    precio := (StrToInt(DBEPrecio1.Text) * 25 Div 100 + StrToInt(DBEPrecio1.Text));
    DBEPrecio3.Text := IntToStr(precio);
    precio := (StrToInt(DBEPrecio1.Text) * 35 Div 100 + StrToInt(DBEPrecio1.Text));
    DBEPrecio4.Text := IntToStr(precio);
    precio := (StrToInt(DBEPrecio1.Text) * 40 Div 100 + StrToInt(DBEPrecio1.Text));
    DBEPrecio5.Text := IntToStr(precio);
    precio := (StrToInt(DBEPrecio1.Text) * 8 Div 100 + StrToInt(DBEPrecio1.Text));
    DBEPrecio6.Text := IntToStr(precio);

  end;
end;

end.


Disculpen por poner un código tan largo.. pero espero así ser lo mas claro posible

cual sería la solución para este caso ?? ( pueden ver la imagen para tener una idea mas clara )

Bueno.. creo que son esas todas mis dudas tontas que tengo y no puedo resolverlas solo

Bueno pues según yo tendré que hacerlo TODO con SQL no ??? ya no usaré una TTabla para eso verdad ?

Saludos y gracias por leeme.

Última edición por BlackDaemon fecha: 22-03-2007 a las 03:58:53.
Responder Con Cita
  #8  
Antiguo 22-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Antes de nada te recomiendo un manual de sql, avanzarás más rápido, éste es uno de tantos, pero busca un poco, los hay de todo tipo.

Lo de borrar un producto y que se borren las tarifas, se llama integridad referencial, en el caso de mysql no sé la respuesta, pero básicamente hay que decirle a la base de datos que el campo CodProductos de la tabla tarifas es una clave ajena (foreign key) de la tabla productos, y en caso de borrado de un producto, se borre todos las filas de ese producto en la tabla tarifas (ON DELETE CASCADE). Aqui viene

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 22-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Gracias Lepe y si, si tengo un manual de SQL a mano siempre que necesito algo.. pero como esto de integridad referenciál no sabía osea que no tenía idea de como buscar.. gracias por darte la molestia de ponerme los link .. en este momento estoy en el trabajo, cuando llegue a casa lo probaré y luego comento que pasó y seguro que tendré otro problema..

gracias

salud!!
Responder Con Cita
  #10  
Antiguo 22-03-2007
Avatar de sierraja
sierraja sierraja is offline
Miembro
 
Registrado: sep 2004
Posts: 281
Poder: 20
sierraja Va por buen camino
Saludos, creo que mi intervencion es un poco tardia, pero si te sirve de algo, yo estoy desarrollando un sistema de facturacion y ya pase por la parte de ventas, y si efectivamente maneje solo tres precios y el detalle de la lista de productos coloque una tabla temporal donde agregaba, eliminaba y modificaba cualquier producto, tambien al momento de agregar cada producto tiene la posibilidad de escoger el precio que quieras para ese producto solamente y me ha funcionado muy bien. Tambien observe que estas utilizando Bs. quiere decir que estas en Venezuela. De todas maneras podriamos intercambiar informacion ya que yo manejo la misma moneda. Saludos.
Responder Con Cita
  #11  
Antiguo 22-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Pues que información podríamos intercambiar ?? Si tu ya lo tienes todo listo, además no soy de Venezuela , soy de Bolivia como dice en la parte superior-izquierda de cada mensaje en el foro
y por lo que me dices veo que usas un DBGrid para eso verdad ??
o estás usando un stringGrid ? si sería eso podrías pastear tu código ??
ya que no quisiera repetir las mas de 1000 líneas que puse en los anteriores post, con los que te darás cuenta de cual es mi problema.

saludos.

PD lo siento pero soy nuevo en esto y no creo que pueda servirte de mucha ayuda y tu si a mi jiji
Responder Con Cita
  #12  
Antiguo 22-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola Lepe he estado leyendo http://www.mysql-hispano.org/page.php?id=27&pag=9

le entendí todo y es inetresante la forma como manejan las tablas de esa forma.. ya había leido antes sobre eso, pero algo superficial y ahora entendí mejor y comprendí todo, ahora me parece un poco mas complicado hacer todo eso de

Código SQL [-]
mysql> ALTER TABLE venta DROP FOREIGN KEY 0_26;
Query OK, 2 rows affected (0.22 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE venta ADD FOREIGN KEY(id_cliente)
    -> REFERENCES cliente(id_cliente) ON DELETE RESTRICT ON UPDATE CASCADE;
Query OK, 2 rows affected (0.22 sec)
Records: 2  Duplicates: 0  Warnings: 0

es un ejemplo.

hacer eso cada ves que quiero UPDATEAR o EDITAR un precio..
Bueno no es que es difícil.. pero no sería una mejor idea de mantener una sola tabla PRODCUTOS como la tenía en mi primer post, y de ahi leer los valores de los precios correspondientes ???

Bueno solo pienso eso.. por que no lo se hacer
Si es que es mejor de esta forma pues seguiré adelante de esta forma aunque me cueste un hue**

Si sería de mantener mi anterior tabla PRODUCTOS con los campos ahí mismo como sería para poder actualizar un StringGrid con una lista de precios seleccionada por el usuario en en ComboBox ??

Creo que solo sería cambiar en este código algo no ??

Código Delphi [-]
    DM.ZQActualizaListaPrecio.Close;
    DM.ZQActualizaListaPrecio.SQL.Clear;
    DM.ZQActualizaListaPrecio.SQL.Add('SELECT precio FROM Tarifas');
    DM.ZQActualizaListaPrecio.SQL.Add('Where CodProducto = :codigo');
    DM.ZQActualizaListaPrecio.SQL.Add('and Tipo_Tarifa = :Tarifa');
    DM.ZQActualizaListaPrecio.prepare;

with DM.ZQActualizaListaPrecio DO
For i:=0 to  SGListaProductos.RowCount-1 Do
Begin
  ParamByName('codigo').AsInteger  := StrToInt(SGListaProductos.Cells[3,i]);
  ParamByName('Tarifa').AsString = combobox1.items[combobox1.Itemindex];
  Open; // abrimos la consulta
   if not IsEmpty then

      SGListaProductos.Cells[7,i] := Fieldbyname('Precio').AsString; 
  //solo debería existir un registro para esta tarifa y este producto.
   else
   begin
     ShowMessage('No existe El tipo de tarifa para el producto' + StrToInt(SGListaProductos.Cells[3,i]));
     SGListaProductos.Cells[7,i] := '<< Error >>';
  end;  
  Close; // cerramos la consulta para la próxima iteración del bucle.   
End;

Bueno creo que cambiando esta parte :

Código Delphi [-]
    DM.ZQActualizaListaPrecio.Close;
    DM.ZQActualizaListaPrecio.SQL.Clear;
    DM.ZQActualizaListaPrecio.SQL.Add('SELECT precio FROM Tarifas');
    DM.ZQActualizaListaPrecio.SQL.Add('Where CodProducto = :codigo');
    DM.ZQActualizaListaPrecio.SQL.Add('and Tipo_Tarifa = :Tarifa');
    DM.ZQActualizaListaPrecio.prepare;

se podría leer de mi tabla PRODUCTOS donde tengo los las tarifas ??

Bueno si no es posible o se complicaría mas aún.. seguiré tu consejo, lo que acabo de poner es solo una idea mia

salud!!
Responder Con Cita
  #13  
Antiguo 23-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Código SQL [-]
ALTER TABLE venta ADD FOREIGN KEY(id_cliente)
    -> REFERENCES cliente(id_cliente) ON DELETE RESTRICT ON UPDATE CASCADE;

No hombre no....

Si en lugar de ON DELETE RESTRICT pones ON DELETE CASCADE, cuando borras un cliente, automáticamente se borrarán todas las ventas que tenga ese cliente en la base de datos, TODAS.

El hecho de poner ALTER TABLE (alterar la estructura de la tabla), es para indicar que MySql tenga este tipo de comportamiento. Lo defines una sola vez, y servirá para todos los registros.

Aplicándolo a la tabla productos y tarifas: Si borras un producto, porque no lo vas a utilizar más, MySql borraría todas las tarifas que existiesen de ese producto:
Código SQL [-]
ALTER TABLE tarifas ADD FOREIGN KEY(Codproducto)
    -> REFERENCES Productos(CodProducto) ON DELETE CASCADE ON UPDATE CASCADE;

Ahora piensa "a lo grande": Tienes un proveedor, ese proveedor te da muchos productos, productos que a su vez estarán en facturas que vendes a tus Clientes, clientes con sus datos personales. Bien definido el sistema, podrías hacer que al borrar un proveedor, se borraran todos los registros asociados, es decir, productos, facturas, clientes, etc. Todo con un simple borrado de un registro en la tabla proveedores.

¿Peligroso? puede, por eso mismo tienes que pararte a pensar si poner ON DELETE CASCADE o bien ON DELETE NULL o bien ON DELETE RESTRICT

¿Potente? por supuesto, puedes desencadenar el borrado en 10, 20 o 100 tablas con solo borrar 1 registro ¡¡ sin escribir ni una sola línea de código delphi!!

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 23-03-2007 a las 00:22:06.
Responder Con Cita
  #14  
Antiguo 23-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
ahhhhhhh bueno Lepe ahora si entendí bién.. y tienes toda la razón en esos puntos del final de tu post, en eso de peligroso, potente
Es la verdad.. creo que aprenderé a usar así mis tablas de ahora en adelante ya que creo que te libra de muchos problemas

Bueno Lepe muchas gracias por la info, he estado todo el día sentado a ver si alguien respondía el tema jeje y ahora que ya lo sé y lo tengo mas claro lo pondré a la práctica, mañana tendré algunos resultados malos o buenos, eso ya se verá en la practica.. jeje muchas gracias de nuevo
Es que pensé que eso lo tennía que hacer cada ves que un registro o elimine o modifique, pero ahora me doy cuenta que solo se hace una ves y luego es normal..


salud pues!
Responder Con Cita
  #15  
Antiguo 23-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola,
tengo problemas al poner esto.

Código SQL [-]
mysql> ALTER TABLE tarifas ADD FOREIGN KEY(Id_producto)
    -> REFERENCES Productos(id_producto) ON DELETE CASCADE ON UPTADE CASCADE;

me da este error :

Código:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'UPTAD
E CASCADE' at line 2
Bueno no se por que es si modifiqué mis 2 tablas y quedaron así.

Código:
mysql> SHOW CREATE TABLE tarifas;
Código SQL [-]
tarifas | CREATE TABLE `tarifas` (
`Id_producto` int(11) NOT NULL,
`CadigoBarra` bigint(20) NOT NULL,
`CodProducto` varchar(20) NOT NULL,
`TipoTarifa` varchar(10) NOT NULL,
`Precio` double NOT NULL,
PRIMARY KEY  (`CadigoBarra`),
KEY `id_producto` (`Id_producto`)
ENGINE=InnoDB DEFAULT CHARSET=utf8

y mi tabla PRODUCTOS asi

Código:
mysql> SHOW CREATE TABLE productos;
Código SQL [-]
productos | CREATE TABLE `productos` (
`ID_producto` int(10) unsigned NOT NULL auto_increment,
`CodProducto` varchar(10) NOT NULL,
`CodigoBarra` bigint(20) NOT NULL default '0',
`Descripcion` varchar(30) NOT NULL default '',
`Categoria` varchar(20) NOT NULL default '',
`SubCategoria` varchar(20) NOT NULL default '',
`Unidad` varchar(5) NOT NULL,
`Cantidad` int(11) NOT NULL default '0',
`Proveedor` varchar(20) NOT NULL default '',
`UnidadPrecio` varchar(5) NOT NULL default '',
`PrecioCompraBs` float default '0',
`PrecioCompraSus` float default '0',
`Costo` float default '0',
`Precio1` float NOT NULL default '0',
`Precio2` float default NULL,
`Precio3` float default NULL,
`Precio4` float default NULL,
`Precio5` float default NULL,
`Precio6` float default NULL,
`FechaActualizacion` date NOT NULL default '0000-00-00',
PRIMARY KEY  (`ID_producto`)
ENGINE=InnoDB DEFAULT CHARSET=latin1

Bueno los prcios no los quité todavía de aquí y tampoco pienso quitarlos xDD
Ahora que lo pensé esos serán los que se visualicen al momento de hacer un Table.next; o last; etc. Pero claro.. no afectarán en nada.. y los otros serán de donde leere los valores.. al momento de agregar un producto tendría que INSERTAR los precios tanto a la tabla PRODUCTOS como a la tabla TARIFAS pero eso no es problema por que con mi código que tenía se puede hcer eso.

Bueno ahora cual es el problema ?? no veo ningún problema que esté comentiendo pero me da ese error
Será por que los tipos de campos no son compatibles? ??
Pero si por lo que veo si son.. BIGINT los 2 y el otro INT

Ya ahora si que no se cual es el error.

salud!!
Responder Con Cita
  #16  
Antiguo 23-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Tú lo has dicho, uno lo defines como Int(10) y el otro como int(11) deben ser iguales, porque se guardará el mismo número. Además uno es unsigned y el otro no.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #17  
Antiguo 23-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por BlackDaemon
he estado todo el día sentado a ver si alguien respondía el tema jeje
, Por eso mismo se comenta que en los foros no hay "urgencias", ya ves, tenemos 7 horas de diferencia entre Bolivia y España , sin contar que yo tenga un rato libre para entrar al foro.

Saludos peninsulares (15:49 )
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #18  
Antiguo 23-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola hola..

óh! que tondo he sido al no darme cuenta en eso y yo me me cuidaba en ese aspecto.. y se me fué
Bueno ahora aquí con buenas notícias.. he tenía "creo" buenos avances con respecto a esto de la integridad referencial en MySQL y comprendí todo, me quedó todo muy claro Lepe ahora implenté tus ideas y sugerencias y aquí traigo los resultados en código.

Primero Mi tabla PRODUCTOS tengo de clave primaria el campo y es autoincrementable, aunque leyendo sobre ese tipo de campo no era posible en versiones anteriores aquí explican un poco mejor sobre el tema para alguien que tenga ganas de aprender
http://dev.mysql.com/doc/refman/5.0/...nt-column.html
http://dev.mysql.com/doc/refman/5.0/...trictions.html

Ahora como les decía que este es mi campo en la tabla PRODUCTOS

Id_productos


Mi tabla TARIFAS la mentení tal y como estaba solo cambiando los valores de int(11) y quité el autoincrement y también quité que el campo CodigoBarra sea la llave primaria.. por que al serlo no permite que se repitan y yo SI necesito que se repitan cada Codigo de barra.. es mas.. se repetirían 6 veces de acuerdo a la cantidad de lista de precios para cada producto,

Luego de eso con este código en mi boton guardar de mi form donde agrego y modifíco los precios, nombres, códigos, etc

Código Delphi [-]
procedure TFrmAgregarProductos.SBGuardarClick(Sender: TObject);
begin
  DM.ZTAlmacen.FieldByName('FechaActualizacion').AsDateTime := DateTimePicker1.Date;
  DM.ZTAlmacen.Post;
  with DM.ZQTarifas do
  begin
    Close;
    SQL.Clear;
    SQL.Add('INSERT INTO `tarifas` (`Id_producto`, `CodigoBarra` , `CodProducto` , `TipoTarifa` , `Precio` )');
    SQL.Add('VALUES (:IDP, :CB, :CP, :TT1, :P1), ');
    SQL.Add('(:IDP, :CB, :CP, :TT2, :P2), ');
    SQL.Add('(:IDP, :CB, :CP, :TT3, :P3), ');
    SQL.Add('(:IDP, :CB, :CP, :TT4, :P4), ');
    SQL.Add('(:IDP, :CB, :CP, :TT5, :P5), ');
    SQL.Add('(:IDP, :CB, :CP, :TT6, :P6)');

    // Si, asignamos los parámetros xDD
    ParamByName('IDP').AsInteger := DM.ZTAlmacen.FieldByname('id_producto').AsInteger;
    ParamByName('CB').AsString := DBECodigoBarra.Text;
    ParamByName('CP').AsString := DBECodigoProducto.Text;
    ParamByName('TT1').AsString := 'Precio1';
    ParamByName('TT2').AsString := 'Precio2';
    ParamByName('TT3').AsString := 'Precio3';
    ParamByName('TT4').AsString := 'Precio4';
    ParamByName('TT5').AsString := 'Precio5';
    ParamByName('TT6').AsString := 'Precio6';

    ParamByName('P1').AsString := DBEPrecio1.Text;
    ParamByName('P2').AsString := DBEPrecio2.Text;
    ParamByName('P3').AsString := DBEPrecio3.Text;
    ParamByName('P4').AsString := DBEPrecio4.Text;
    ParamByName('P5').AsString := DBEPrecio5.Text;
    ParamByName('P6').AsString := DBEPrecio6.Text;
    // Ejecutamos e insertamos todos los valores asignados
    ExecSQL;

  end;

  ModoEditar(False);
end;

ahora explico.

DM.ZTAlmacen.Post; esto lo que hace es guardar TODOS los datos que están en los diferentes DBEdits de mi form.. y ahora como podrán ver guardo los precios y codigos en 2 tablas si en la tabla productos y tarifas
eso es debido a que me resultará mas fácil mostrar resultados PERO creo que para hacer un UPDATE tendré que hacer a las 2 tablas claro está... no se si esto sea bueno o no, pero no encuentro otra colución para mostrar las tarifas en un FORM con un simple TTable.next; o de esta forma recorrer fila por fila de un campo para ir mostrando en los diferentes DBEdits.. vamos como lo hacía antes yo pero eso se podía por que estaban en una misma tabla las características, , tarífas, y códigos, bueno si alguien me dice como puedo hacer como un simple TTable.Next estaría muy agradecido...

Puedo hacer es tener una TTTarifas y conectarlo a mis DBEPrecio1, DBEPrecio2, etc.. luego llenar la tabla TARIFAS con un query.. pero para recorrer los campo de uno a uno hacerlo con la TTTarifa.Next ???
Pero claro.. solo serviría para eso. por que no pienso usar el TTable.appent, open, y POST.. solo serviria para lo antes dicho, recorrer una fila

Por ej tengo un totón que es SIGUIENTE y lo que tiene es:

Código Delphi [-]
procedure TFrmAgregarProductos.SBSiguienteClick(Sender: TObject);
begin
  DM.ZTAlmacen.Next;
end;

entonces con mi nueva tabla quedaría

Código Delphi [-]
procedure TFrmAgregarProductos.SBSiguienteClick(Sender: TObject);
begin
  DM.ZTAlmacen.Next;
  DM:ZTTarifas.Next;
end;

eso irá sincronizado ??? osea las descripciones, unidaddes de precio, etc con las tarífas que están en la tabla TARIFAS ???

si es que no habrá problemas cuando elimine un producto creo que sería una idea, ademas como ahora trabajo con innoDB al aleminar un producto se eliminará también en la tabla TARIFAS todos los 6 precios incluyendo el id_producto, osea TODO.

bueno voy a comer..

salud!


Oh!! que mala suerte yo que pensaba que todo estaba bién ocurre siempre un problema
resulta que ahora cuando edito un producto me escribe en la tabla TARIFAS de nuevo los precios osea 6 filas mas.. cada ves que edito algo.. claro por que en mi código está así, y tendré que ver que hacer para poder saber si está un producto con el mismo id_producto para que lo edite. pero creo que tendré que hacer puro SQL y olvidarme de mi TABLA y usar puros QUERYS

asludos

Última edición por BlackDaemon fecha: 23-03-2007 a las 21:37:00.
Responder Con Cita
  #19  
Antiguo 23-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Te estas complicando la vida mucho.

Estudia las Formas Normales o Normalización de tablas, es todo un concepto basado en muchos años de experiencias en diseños de Bases de datos; son las normas para crear una base de datos eficiente, fácil de mantener y ampliar.

Lo que pides es muy muy fácil, ahora no puedes usar DBEdits, porque no vas a tener 6 precios, al tener la tabla tarifas el usuario podrá crear 10 o 100 precios distintos.... por tanto usa un grid atado a un Query:

Yo no uso MySql, pero seguro que tiene un componente llamado MyDataset que tiene 4 sqls:
- Delete
- Insert
- Update
- Select

Rellenando cada una de ellas, puedes mostrar en el grid todas las tarifas y precios y que se puedan modificar desde el mismo grid. En el MyDataset puedes asignarle su propiedad MasterSource al DataSource de Productos, de esa forma al cambiar de producto, se muestran en el grid las tarifas del nuevo Producto elegido.

Los precios de la tabla productos... sobran, debes eliminarlos.

Necesitas urgentemente dejar de programar y pararte a estudiar los conceptos de la tecnología Cliente/Servidor, Diseños de Bases de datos y Normalización de tablas.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #20  
Antiguo 23-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Oh!! que mala suerte yo que pensaba que todo estaba bién ocurre siempre un problema
resulta que ahora cuando edito un producto me escribe en la tabla TARIFAS de nuevo los precios osea 6 filas mas.. cada ves que edito algo.. claro por que en mi código está así, y tendré que ver que hacer para poder saber si está un producto con el mismo id_producto para que lo edite. pero creo que tendré que hacer puro SQL y olvidarme de mi TABLA y usar puros QUERYS

saludos


**************************Table.Edit;*********************************

Bueno edito por que justamente cuando postee tu también lo hiciste.. y tendré que seguir tus consejos, voy a eliminar de mi tabla PRODUCTOS todos los precios y trabajar como deve ser, así no se hará una chapucera todo jejeje

ahh una cosa mas.. pero es que los 6 precios son fijos, no habrán mas de esos, ademas que tiene que ser en edits o DBEdits por que si te fija en esta parte de mi código del Form VENTAS tengo esto.

Código Delphi [-]
procedure TFrmAgregarProductos.DBEPrecio1KeyPress(Sender: TObject;
  var Key: Char);
var precio : Integer;
begin
  if Key = #13 then begin
    Key := #0; //quitamos el sonido
    precio := (StrToInt(DBEPrecio1.Text) * 16 Div 100 + StrToInt(DBEPrecio1.Text));
    DBEPrecio2.Text := IntToStr(precio);
    precio := (StrToInt(DBEPrecio1.Text) * 25 Div 100 + StrToInt(DBEPrecio1.Text));
    DBEPrecio3.Text := IntToStr(precio);
    precio := (StrToInt(DBEPrecio1.Text) * 35 Div 100 + StrToInt(DBEPrecio1.Text));
    DBEPrecio4.Text := IntToStr(precio);
    precio := (StrToInt(DBEPrecio1.Text) * 40 Div 100 + StrToInt(DBEPrecio1.Text));
    DBEPrecio5.Text := IntToStr(precio);
    precio := (StrToInt(DBEPrecio1.Text) * 8 Div 100 + StrToInt(DBEPrecio1.Text));
    DBEPrecio6.Text := IntToStr(precio);

  end;
end;

que calcula automaticamente con un porcetaje relacionado al primer precio
alguna otra forma de hacerlo ??


bueno luego cuento que tal

salud !

Última edición por BlackDaemon fecha: 23-03-2007 a las 23:07:24.
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
Actualizar Archivos Desde FTP papu24ar Varios 4 21-03-2007 03:50:57
Actualizar una base de datos desde un servidor remoto zvf MySQL 1 22-06-2006 22:21:26
Actualizar una base de datos desde un formulario federiconqn21 Varios 1 14-12-2005 16:43:23
Impresión desde un StringGrid... Lester Impresión 10 26-03-2005 07:14:29
Impresion desde un StringGrid fmonte Varios 3 17-09-2004 05:28:29


La franja horaria es GMT +2. Ahora son las 16:09:22.


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