Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   comprobar valor en base de datos (https://www.clubdelphi.com/foros/showthread.php?t=36882)

lalomon 27-10-2006 02:25:02

comprobar valor en base de datos
 
hola amigos del club delphi :D, 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

Neftali [Germán.Estévez] 27-10-2006 10:05:28

Cita:

Empezado por lalomon
...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....

...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 ventaja que tiene este sistema es que cuando la tenga unos cuantos registros te podrás ir a tomar café mientras busca el siguiente número...:D:D

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.

lalomon 30-10-2006 14:36:36

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

Neftali [Germán.Estévez] 30-10-2006 16:01:50

Cita:

Empezado por lalomon
...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.

Lo primero, decir que dependiendo de las librerías que utilices para acceder a la Base de Datos, puede ser que éstas te recuperen el código de forma automática una vez insertado el registro.
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.

lalomon 30-10-2006 18:28:41

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 :D.
pd3:Muchas gracias por reponder mis preguntillas ^^

Neftali [Germán.Estévez] 31-10-2006 10:51:58

Cita:

Empezado por lalomon
...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...

Se me ocurre, por ejemplo, que con un Stored Procedure podrías hacer la inserción y devolver el código insertado en un sólo paso. En lugar de utilizar el SQL Pelado para insertar.

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).

lalomon 31-10-2006 23:46:37

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 :D

Neftali [Germán.Estévez] 02-11-2006 11:36:37

Cita:

Empezado por lalomon
...es que estoy trabajando en MySql 4, por lo que no es posible crear procedimientos almacenados.

¿Eso qué significa? ¿MySQL 4 no tiene Stored Procedures?

lalomon 11-11-2006 17:40:09

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 :)

Neftali [Germán.Estévez] 13-11-2006 10:12:32

Cita:

Empezado por lalomon
...MySQL 4 no tiene stored procedures, o procedimientos almacenados...

¡¡Pues me has dejado de piedra!! (no lo sabía)


La franja horaria es GMT +2. Ahora son las 11:33:10.

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