Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-10-2006
lalomon lalomon is offline
Miembro
 
Registrado: nov 2005
Posts: 10
Poder: 0
lalomon Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 27-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.276
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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...

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.
Responder Con Cita
  #3  
Antiguo 30-10-2006
lalomon lalomon is offline
Miembro
 
Registrado: nov 2005
Posts: 10
Poder: 0
lalomon Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 30-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.276
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
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.
Responder Con Cita
  #5  
Antiguo 30-10-2006
lalomon lalomon is offline
Miembro
 
Registrado: nov 2005
Posts: 10
Poder: 0
lalomon Va por buen camino
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 ^^
Responder Con Cita
  #6  
Antiguo 31-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.276
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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).
__________________
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.
Responder Con Cita
  #7  
Antiguo 31-10-2006
lalomon lalomon is offline
Miembro
 
Registrado: nov 2005
Posts: 10
Poder: 0
lalomon Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 02-11-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.276
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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?
__________________
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.
Responder Con Cita
  #9  
Antiguo 11-11-2006
lalomon lalomon is offline
Miembro
 
Registrado: nov 2005
Posts: 10
Poder: 0
lalomon Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 13-11-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.276
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por lalomon
...MySQL 4 no tiene stored procedures, o procedimientos almacenados...
¡¡Pues me has dejado de piedra!! (no lo sabía)
__________________
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.
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 17:38:51.


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
Copyright 1996-2007 Club Delphi