FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
comprobar valor en base de datos
hola amigos del club delphi , una vez mas recurro a ustedes en busca de consejo, ya que me han salvado en varias ocaciones.
tenog el siguiente problema o duda :S estoy desarrollando un sistema de ventas y necesito enumerar con un valor unico cada venta que se realiza, este codigo debe ser generado por el propio sistema y no debe existir en la base de datos(bueno el mismo insert se encarga de validar eso ya que es PK de la tabla ventas). para validar que no este en la base de datos, lo que estoy haciendo en este momento es recorrer la tabla de ventas, que la saco con un ADODataSet, y comparo el codigo de la venta con cada uno de los existentes, si es igual a alguno lo aumento en 1 para obtener un nuevo valor, la primera venta es identificada con un 1 y saco el count de la tabla, y le sumo 1 para definir el siguiente codigo de venta(asi minimizo la posibilidad de que ya exista el codigo), el gran PERO es que cuando la cantidad de ventas llegue a un numero demasiado grande el ciclo while sera muy pesado, para solucionar esto pense en generar otro ADODataSet que realice un select a la tabla venta con el codigo que genere ("select * from venta where codigoVenta='valorGeneradoPorMiSistema'") y si el resultado es nil entonces asigno el codigo generado, pero esto = es muy costoso (muchas consultas si el codigo esta repetido), por esto queria ver si alguien tiene alguna idea para solucionar este problema, a pasado por mi mente realizar un random y seguir con lo propuesto antes, pero = cabe la posibilidad de hacer mas consultas de las necesarias. estoy trabajando con MySQL 4. weno esa es mi duda, cualquier sugerencia se agradece ^^. att lalomon |
#2
|
||||
|
||||
Cita:
No en serio. Porqué no utilizas un campo autoincremental (en cada BD tiene un nombre distinto). Todas las Bases de Datos tienen un sistema para generar automáticamente estos números, de forma que el sistema se encarga de generar el "siguiente número" cada vez que se inserta un nuevo registro, sin que tú tengas que programar nada y sin que se repitan.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#3
|
|||
|
|||
OH gracias Neftali por la respuesta, la verdad me hubiese ayudado mucho, pero el problema es que necesito luego ingresar el detalle de la venta, el cual usa como clave foranea, el codigo de venta, y usando el campo autoincremental, no tengo como recuperar el codigo de venta generado por la base de datos.
pense en, luego de ingresar la venta, hacer un select a la tabla para sacar el codigo, PERO si hubiese otra transaccion del mismo tipo en ese momento, el codigo recuperado podria no pertenecer a la venta realizada. wenu ojala exista alguna forma de obtener ese codigo que genera la BD, dentro de una misma transaccion (asi, me podria asegurar que nadie insertase otro elemento hasta que termine de sacar el codigo generado :S) si alguien tiene otra sugerencia se agradece Última edición por lalomon fecha: 30-10-2006 a las 15:51:31. |
#4
|
||||
|
||||
Cita:
Y segundo, dependiendo de cómo hagas el SELECT y cómo tengas configuradas las transacciones (o mejor dicho el nivel de aislamiento de estas) no deberías tener problemas en recuperar el valor insertado.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#5
|
|||
|
|||
gracias por responder neftali ^^
estoy trabajando con mysql 4 y me conecto via ODBC, el problema que tengo es el siguiente, la insercion de la venta es una consulta SQL, en esta se genera el codigo de venta, pero el ingreso del detalle de la venta, es otra consulta, para la cual es necesario tener el codigo de venta para asociarlo. pense en realizar un select a la venta(luego de ingresarla), para obtener el codigo que genero la BD, y en base a esto realizar el ingreso del detalle, pero si alguien ingresa otra venta, entre la insercion de la venta, y la ejecucion de la consulta para obtener el codigo de la venta, se generara un enrredo entre las ventas, recuerda que lo que estamos generando es la clave primaria, por lo que si nos es desconocida, no tenemos como obtener con un 100% de certeza la tupla asociada a esta. pd1: como son puntos de ventas no es raro que tenga muchos ingresos de ventas al mismo tiempo pd2: cada consulta SQL en si, es una transaccion, pero podria unir 2 consultas SQL para que kedaran como una sola transaccion bloquenado el acceso a la BD hasta que finalice su ejecucion? si se puede tendriamos el problema resuelto . pd3:Muchas gracias por reponder mis preguntillas ^^ |
#6
|
||||
|
||||
Cita:
Revisa los niveles de aislamiento de las transacciones. Puede ser que te interese utilizar un nivel serializable en ese punto para asegurar que no existe operaciones entre la inserción y la consulta (de todos formas mucho cuidado con los niveles muy restrictivos).
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#7
|
|||
|
|||
mmm el problema mi amigo es que estoy trabajando en MySql 4, por lo que no es posible crear procedimientos almacenados.
con respecto al aislamiento de la transacion, no me preocupa demasiado, ya que una vez realizada la insercion, identificada por un codigo unico, las siguientes tareas realizadas, realtivas a esta insercion, se identificaran con ese unico codigo(por eso es tan importante el no perderlo). wenu seguire buscando alguna otra solucion gracias por las ideas |
#8
|
||||
|
||||
Cita:
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#9
|
|||
|
|||
U.U me demore un poquito en resonder.
weno sip, MySQL 4 no tiene stored procedures, o procedimientos almacenados, creo que por eso y por algunos problemas de atomicidad en la operaciones, habia gente que no lo consideraba un motor de base de datos. pd: gracias por las respuestas |
#10
|
||||
|
||||
Cita:
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Guardar en 1 base de datos SQL, datos procedentes de 2 tablas distintas | adaypr | C++ Builder | 1 | 05-09-2006 11:56:33 |
comprobar datos en DBgrid | coleleon | OOP | 1 | 11-12-2005 13:28:49 |
ubicar archivo, con datos sacados de base de datos | Giniromero | Varios | 19 | 20-10-2005 16:23:02 |
Asignar valor a un campo en una base de datos | jdattoli | Conexión con bases de datos | 3 | 12-10-2005 20:59:02 |
Reto Para Expertos En Base De Datos Y Tipos De Datos.... (blob) | frankmch | Conexión con bases de datos | 2 | 08-09-2003 19:44:52 |
|