![]() |
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 :D 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 :D 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 :D 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.
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 :D 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é :)
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 :D 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
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!!! |
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:
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 Después, para presentar la lista en el combo haría algo así:
En el combo podría presentar el campo Tipo_Tarifa, y el usuario elije la que quiere aplicar. Saludos |
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 :
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 :p 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 :mad: , 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 :D salud!! |
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:
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: y ya en el Oncreate de la ventana:
Saludos |
jojojo ahora si creo que esto es lo que necesitaba :) Lepe :D
bueno en este mismo momento estoy probando el código :cool: de 10 minutos te digo el resultado.. se que este post no tiene sentido pero te agradesco por tu respuesta saludos pues !! |
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
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
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
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 ?
si es así no habrá problemas.. :D 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!! |
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 :confused:
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.
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 :o 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. |
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 |
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!! |
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. :D
|
Pues que información podríamos intercambiar ?? Si tu ya lo tienes todo listo, además no soy de Venezuela :D , 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 :cool: jiji |
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
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 :D 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 ??
Bueno creo que cambiando esta parte :
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!! |
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:
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 |
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 :D
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! |
Hola,
tengo problemas al poner esto.
me da este error : Código:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that Código:
mysql> SHOW CREATE TABLE tarifas;
y mi tabla PRODUCTOS asi Código:
mysql> SHOW CREATE TABLE productos;
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!! |
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 |
Cita:
Saludos peninsulares (15:49 ;)) |
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
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:
entonces con mi nueva tabla quedaría
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 |
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 |
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.
que calcula automaticamente con un porcetaje relacionado al primer precio alguna otra forma de hacerlo ?? bueno luego cuento que tal salud ! |
La franja horaria es GMT +2. Ahora son las 04:25:55. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi