Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
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
  #2  
Antiguo 23-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 20
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
  #3  
Antiguo 23-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 20
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
  #4  
Antiguo 23-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
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
  #5  
Antiguo 23-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
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
  #6  
Antiguo 23-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 20
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
  #7  
Antiguo 23-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
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
  #8  
Antiguo 23-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 20
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
  #9  
Antiguo 24-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 20
BlackDaemon Va por buen camino
Hola Lepe ahora si que estoy perdido no se ni que hacer.. o no te entendí bién esta frase:

Cita:
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....
Pues te diré que solo serán 6 precios.. ademas el problema principal no es ese, si no que tiene que calcularse los porcentaje tanbién, y eso lo hacía como muestro en mi anterior POST

Cita:
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.
Pues no entiendo a que se refiere con MyDataSet.. tal vés se que es pero no con ese nombre.. por que soy nuevo en esto. perdón por no comprender.

Cita:
Los precios de la tabla productos... sobran, debes eliminarlos.
Si señor, ya están eliminados los precios. y los manejaré en la otra tabla.

Cita:
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.
Creo que mi problema en este momento es delphi no MySQL.. por que ya probé mi base de datos y si está todo en orden cuando hago un

Código SQL [-]
DELETE FROM productos WHERE id_producto = 1

me elimina todos los datos del id_producto 1 como debe ser, y además elimina de la tabla TARIFAS todos las listas de precios que tienen el id_producto = 1

Osea que esta funcionando bién, ahora mi problema sería con delphi que no se como enlazar los componentes Zquery, Z,Table, DataSource uno con otros para soluionar mi problema.. bueno espero poder haber sido claro, y creo que estoy a punto de superar este mi problema.. se que es algo fácil pero que no puedo darme cuenta, necesito un empujoncito Lepe

saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 23:54:43.


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