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 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
  #2  
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
  #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
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
  #4  
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
  #5  
Antiguo 24-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Los cálculos de porcentajes deberías hacerlos antes de guardar, ya que al presionar una tecla, si usa retroceso para borrar todos los caracteres, cuando no quede ninguno, obtendrás un bonito " '' is not a valid float".

El cálculo, igual pero más simple:
Código Delphi [-]
precio := (StrToInt(DBEPrecio1.Text) * 1.16 ;

Incluso podría hacerse en un trigger before update y before Insert, los cálculos los haría el servidor y no tú desde delphi. Esta idea no viene de la nada, viene de haber leído los manuales de Interbase 6 y Firebird, de ahí que te sugiera estudiar lo propio en MySql. Sabiendo de antemano que es un trigger, como funciona, como se implementa, cuando se ejecuta, etc, tendrás tu mente "más abierta" para solucionar los problemas que te lleguen.

La verdad es que me he confundido con el tema de "MyDataset". Si usas los componentes Zeos, tendrás un ZTable, ZQuery, ZDataset (éste último es al que me refiero), en cliente servidor jamás debería usarse un ZTable, ese componente yo lo veo ahí por compatibilidad y migración, pero no para usarlo en aplicaciones nuevas. Deberías usar un ZDataset y traer solo el registro que desees modificar.

Por mi desconocimiento de los componentes Zeos, no sé si existirá el componente "ZDataset" con ese nombre, puede que tenga otro nombre... a ver si alguien que trabaje con Zeos puede ser más específico.

Para el problema de "unir querys con Grids y demás" mira en la cara oculta de delphi 4, las relaciones Maestro-Detalle es lo que necesitas.

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 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
Bueno pues según lo que ví en las componentes ZEOS tengo esto en las paletas

ZConnection: TZConnection
ZReadOnlyQuery: ZDataSet
ZQuery: ZDataSet
ZTable : ZDataSet
ZUpdateSQL: ZsqlUpdate
ZStoredProc: ZstoredProcedure
ZSQLMetadata: ZSQLMetadata
ZSQLProcessor: ZSQLProcessor
ZSQLMonitor : ZSQLMonitor
ZSequence : ZSequence

Bueno supongo que alos que te refieres don ZDataSet es a los 3 componentes no ?? pero mas seguro solo el ZQUERY por que me dijiste que decarte el STable, bueno eso es lo que haré entonces..

ahora con respecto al porcentaje pues lo tendré que hacer de tu modo por que como dices avees me daba el No is valid integer pero no era bonito era feo xDD

y ahora sobre los tigers me pondré mañana mismo a leer sobre eso tenloo por seguro al igual que lo hice con la integridad referencial que me lo aprendí muy bién y ahora se algo nuevo

ahora sobre el maestro detalle, eso es lo que quería saber.. no sabía con que nombre buscar eso, ahora que lo se tambien tenlo por seguro que lo leere, ya que tengo aquí la cara oculta de delphi 4 y otros manuales en pdf muy buenos. ademas de un libro de anaya que esta bién nomas..

bueno pues Lepe muchas gracias por las recomendaciones y consejos, se que me servirán de ahora en delante para hacer mas sencillas las cosas

saludos y gracias nuevamente.

PD mañana posteo algunas dudas xDD
Responder Con Cita
  #7  
Antiguo 27-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
Bueno aquí vendo despuies de 2 días haber escrito mi último post
Lepe mira, he estado leyendo todos estos días el foro-.. buscando sobre maetro/detalle y encontré vários temas pero no logro entender su funcionamiento.. vamos me doy cuenta de lo que se devería hacer un maestro/detalle, aquí encontré un post explican algo de eso y logré entender algo
http://www.clubdelphi.com/foros/show...aestro+detalle

Pero no es suficiente para poder hacer lo que yo quiero.. en primer lugar NO quiero poner ningún DBGrid en mi form.. con DBEdits me bastaría, tu dices que me olvide de los DBEdits y las ZTAbles, entonces como guardaría un producto ??
SI ya se que se podría hacer con SQL y no es difícil, pero tendría que tomar los datos de Edits verdad ?? o de donde mas lo tomaría ?? ahora.. mi problema esta en querer actualizar un producto y sus 6 precios que tengo en la otra base de datos, podría ser con puro SQL pero SE que no es lo correcto hacerlo, creo que debe haber alguna manéra de hacerlo mas sencillo
Lo único que pretendo hacer es esto:

Agregar un nuevo producto llenando unos DBEdits o EDits, luego llenar tambien unos DBEdits o Edits con los 6 precios que se alamcenarán en la otra tabla TARIFAS, bueno eso lo hice con SQL y copié el id_producto a la tabla TARIFAS por cada producto, cosa que quedaría así
Un producto con todas las descripciones en la tabla PRODCUTOS y los 6 precios y sus códigos en la tabla TARIFAS, bueno hasta haý no hay problema, por que cuando elimino un producto tam,bién se eliminar los 5 precios, PERO el problema está al editar un producto no edita en la tabla TARIFAS con mi código que puse en los anteriores post, lo único que hace es editar los campor de la tabla PRODCUTOS pero NO edita los 6 precios y códigos de la tabla TARIFAS, lo que hace es agregarme los mismos 6 precios ( en el caso de que no modificaron los precios ) con el mismo id_producto, osea serían 12 precios para el id_producto y si otra ves actualizo me graba 6 precios mas xDD osea 18 ya serían.. lo único que quiero es que UPDATE los precios y códigos en la tabla TARIFAS.. eso es lo que quiero saber.. si tendría que hacerlo puro SQL ?? o hay algún componete como el ZUpdateQUery ???? he estado leyendo tambien sobre en en este tema
http://www.clubdelphi.com/foros/show...=3802#post3802

o se si me serviría pero bueno.. para que no digan que no busco o que no leo la verdad es que me frustra no poder hacer algo tan secillo que parece.. y se que cuando aprenda diré : oh he sido un tonto al no poder hacer algo tan sencillo

Y otra cosa.. que acreo que aquí viene lo de master/detail es que quiero mostrar los datos de los productos todo en uno, osea descripciones del producto que leere de la tabla PRODCUTOS y sus precios y códigos que leeré de la tabla TARIFAS, bueno ahora eso lo tengo que hacer puro SQL también ?? o con master/detail solo tengo que escojer los campos de las tablas ?? no entiendo muy bién que inutil que soy

Bueno creo que lo mejor me vendría es un pequeño ejemplo de lo que pretendo hacer,

aquí les dejo una pequeña base de datos relacionales.

Código SQL [-]
-- Base de datos: `test`

CREATE TABLE `cliente` (
  `id_cliente` int(11) NOT NULL,
  `nombre` varchar(30) default NULL,
  PRIMARY KEY  (`id_cliente`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `venta` (
  `id_factura` int(11) NOT NULL,
  `id_cliente` int(11) NOT NULL,
  `cantidad` int(11) default NULL,
  PRIMARY KEY  (`id_factura`),
  KEY `id_cliente` (`id_cliente`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


-- 
-- Filtros para la tabla `venta`
-- 
ALTER TABLE `venta`
  ADD CONSTRAINT `venta_ibfk_1` FOREIGN KEY (`id_cliente`) REFERENCES `cliente` (`id_cliente`) ON DELETE CASCADE ON UPDATE CASCADE;

Bueno a ver si alguien TAN amable me hace un ejemplo con esa pequeña base de datos.. como poder agregar 6 catidades para un mismo id_cliente y luego poder editarlo esto,,, además un master/detail con eso
La verdad es que solo con eso creo que aprenderé o mejor dicho me daré cuenta en que es lo que fallo y que conceptos tengo mal definidos de lo que leí

saludos y gracias por la ayuda
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 01:26:34.


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