Autor Tema: Utilizar campo texto y no autonumerico para los id's con Access2003  (Leído 10136 veces)

0 Usuarios y 1 Visitante están viendo este tema.

lucius

  • Gigabyte
  • ****
  • Mensajes: 263
  • Reputación: +6/-5
    • Ver Perfil
Al utilizar como id's un campo con tipo de dato autonumerico con primary key no tengo problemas cuando varios usuarios ingresan registros al mismo tiempo e incluso lo he probado insertando registros con 6 usuarios al mismo tiempo mediante un timer.

El problema, no soy experto en programas en red y menos con concurrencia pero ahi voy, necesito que el id de varias tablas no sean solo numeros sino tambien tengan letras asi PQF01, PHJ51..... y aqui no me sirve el campo autonumerico y utilizo tipo texto y al hacer la misma prueba solo me ejecuta al menos 2 usuarios correctamente al resto le da error de primarykey.

Cual seria la mejor manera de manejar esta situacion sabiendo que el campo tiene tipo de dato texto y no autonumerico, tambien pasa lo mismo con mysql y el tipo char aunque aguanta mas usuarios.
« última modificación: Diciembre 11, 2010, 11:49:15 pm por lucius »

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #1 en: Diciembre 12, 2010, 04:51:25 am »
mmm, se me ocurre que tendrías de darle un formato a esa clave, osea crear una nemotecnia. Por ejemplo

DDMMYY HHMMSS NOMBREPC NOMBRE USUARIO

ejemplo

121210050432PCCAJAJUAN

No creo que a esa misma hora y segundo el usuario juan este en dos lugares y si asi lo fuera con el nombre de la pc haces la distinción... En todo caso ajusta con otros datos relevantes para ti. De esta forma no tendrás problemas de error de primarykey, solo cuida si tienes tablas relacionadas y que ellas no tengan el id autonumerico y si fuera el caso aplica la misma regla.

Saludos
Me encuentras en YAcosta.com

wolf_kof

  • Visitante
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #2 en: Diciembre 12, 2010, 12:19:55 pm »
No veo la necesidad de que el indice contenga letras, ya que yo he trabajado con access en red y me funciona muy bien el indice, he logrado conectar hasta 15 equipos y trabajan bien simultaneamente, mas de 15 tampoco te podria dar referencia el encargado de eso seria SSCCAANN43, pero si lo que quieres es tener un indice autonumerico y un subindice que contenga el indice y una especificación puedo ayudarte.

primero: coloca tu indice autonumeroco de preferencia ID, luego crea otro campo llamado ID2 de tipo texto.

segundo: cuando le des la instrucción de guardar en Visual Basic, tiene que llevar la nemotecnia como dice YVANB osea rs!ID2 = "PQF" & rs!ID

con esto tendras el resultado de que en el campo ID2 tendra contenido la memoteca y el indice (ID) de tu tabla para que no tengas ningún problema o para que estes tranquilo, te recomiendo que coloques esta campo como subindice.

SI NO TE RESULTA AVISAME Y TE PONGO UN FORMULARIO DE EJEMPLO
« última modificación: Diciembre 13, 2010, 12:52:52 am por wolf_kof »

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #3 en: Diciembre 12, 2010, 01:56:35 pm »
No se que motor de base de datos estas usando, pero para eso precisamente se utilizan las transacciones. Las transacciones "bloquean" de cierta forma las tablas para evitar las concurrencias circulares que puedes tener al ingresar datos relacionados al mismo tiempo. Investiga

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #4 en: Diciembre 12, 2010, 04:05:58 pm »
No se que motor de base de datos estas usando, pero para eso precisamente se utilizan las transacciones. Las transacciones "bloquean" de cierta forma las tablas para evitar las concurrencias circulares que puedes tener al ingresar datos relacionados al mismo tiempo. Investiga

Si lo dijo doc, esta usando Access2003 y esta en el titulo. y eso que dices es lo que justamente Access no hace, o no hace bien. Hacer eso en Access es jugar con fuego. Suerte
Me encuentras en YAcosta.com

lucius

  • Gigabyte
  • ****
  • Mensajes: 263
  • Reputación: +6/-5
    • Ver Perfil
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #5 en: Diciembre 12, 2010, 07:49:33 pm »
wolf_kof, exelente idea si capte lo que mencionas
raul338, buen dato sobre las transacciones ya habia investigado un poco como aplicarlas.
YvanB, sobre las transacciones las utilizo desde la conexion del mismo vb begin, commit, rollback y no he tenido problema al menos con 1 usuario, con varios usuarios nose! ya que es mi 1er programa en red.

lucius

  • Gigabyte
  • ****
  • Mensajes: 263
  • Reputación: +6/-5
    • Ver Perfil
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #6 en: Diciembre 12, 2010, 08:01:18 pm »
La BD que me han dado ya tiene registros y mas aun las que facturan, con access2003 no me deja cambiar al tipo texto a autonumerico, access me recomienda crear otro campo, en fin mas trabajo para hacer algo medianamente aceptable en red.

Para no andar tocando y moviendo los registros de la BD tengo esta solucion que copie de por ahi, le falta ponerle la nemotecnia pero con esto no hay problema....

Que opinan si utilizo un campo tipo texto y almaceno el ultimo id pero en otra tabla llamada acumulador al cual le sumo 1.
Les parece que una practica aceptable o es demaciada vuelta caso contrario el utilizar id's autonumericos lo resuelve facilmente.

Código: [Seleccionar]
Function funcion_auto_id()
Dim zPlus As String
 
  Set rsAcumulador = dbConex.Execute("SELECT autoClie FROM acumulador")

  zPlus = 0
  rsAcumulador.MoveLast
  zPlus = rsAcumulador(0) + 1
  zPlus = Format(Val(zPlus), "00")

  dbConex.Execute "UPDATE acumulador SET autoClie='" & Trim(zPlus) & "'"
  funcion_auto_id = zPlus

End Function

Function funcion_añadir()
Dim z As String
z = funcion_auto_id
dbConex.Execute ("INSERT INTO Cliente VALUES('" & z & "','" & .Text2.Text & "')")
End Function

Private Sub Command1_Click()

On Error GoTo Err
  cn.BeginTrans
     call funcion_auto_id
     call funcion_añadir
  cn.CommitTrans
Exit Sub
Err:
   cn.RollbackTrans
   If Err.Number = "-2147467259" Then'Error por duplicidad de PK
      'Tambien podria utilizar un msgbox si/no para no generar una especie de bucle
      call funcion_auto_id 'Volvemos a intentar
      call funcion_añadir
   Else
      MsgBox Err.Number & " " & Err.Description
   End If
End Sub

End Sub

« última modificación: Diciembre 12, 2010, 08:10:35 pm por lucius »

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #7 en: Diciembre 12, 2010, 09:46:50 pm »
La BD que me han dado ya tiene registros y mas aun las que facturan, con access2003 no me deja cambiar al tipo texto a autonumerico, access me recomienda crear otro campo, en fin mas trabajo para hacer algo medianamente aceptable en red.

Para no andar tocando y moviendo los registros de la BD tengo esta solucion que copie de por ahi, le falta ponerle la nemotecnia pero con esto no hay problema....

Que opinan si utilizo un campo tipo texto y almaceno el ultimo id pero en otra tabla llamada acumulador al cual le sumo 1.
Les parece que una practica aceptable o es demaciada vuelta caso contrario el utilizar id's autonumericos lo resuelve facilmente.

Código: [Seleccionar]
Function funcion_auto_id()
Dim zPlus As String
 
  Set rsAcumulador = dbConex.Execute("SELECT autoClie FROM acumulador")

  zPlus = 0
  rsAcumulador.MoveLast
  zPlus = rsAcumulador(0) + 1
  zPlus = Format(Val(zPlus), "00")

  dbConex.Execute "UPDATE acumulador SET autoClie='" & Trim(zPlus) & "'"
  funcion_auto_id = zPlus

End Function

Function funcion_añadir()
Dim z As String
z = funcion_auto_id
dbConex.Execute ("INSERT INTO Cliente VALUES('" & z & "','" & .Text2.Text & "')")
End Function

Private Sub Command1_Click()

On Error GoTo Err
  cn.BeginTrans
     call funcion_auto_id
     call funcion_añadir
  cn.CommitTrans
Exit Sub
Err:
   cn.RollbackTrans
   If Err.Number = "-2147467259" Then'Error por duplicidad de PK
      'Tambien podria utilizar un msgbox si/no para no generar una especie de bucle
      call funcion_auto_id 'Volvemos a intentar
      call funcion_añadir
   Else
      MsgBox Err.Number & " " & Err.Description
   End If
End Sub

End Sub

1.- Si una tabla ya tienes registros y el campo ID es autonumerico, yo alguna vez hice el cambio de la siguiente forma (algo artesanal)
a.- Creo una nueva tabla copia de la primera pero solo en su estructura
b.- A esa tabla nueva que tiene el campo autonumerico sin datos le cambio al tipo de dato que te interese.
c.- Copias y pegas los registros de una tabla a otra, a veces me ayudaba con un Excel.

2.- "Que opinan si utilizo un campo tipo texto y almaceno el ultimo id pero en otra tabla llamada acumulador al cual le sumo 1. Les parece que una practica aceptable o es demaciada vuelta caso contrario el utilizar id's autonumericos lo resuelve fácilmente."
Esa es una practica aceptable, incluso varias ERPs la usan. Yo en uno de mis sistemas tengo una tabla que lleva el contador de todas las demás tablas y con una función invocaba el siguiente numero y actualizaba con un mas 1, peor lo use con otros fines. Evalúa si te servirá esto.

El motor de bd que uso es FirebirdSQL, y FirebirdSQL hace algo muy similar,solo que lo administra el motor y no la aplicación. Firebird usa un trigger y un Generador para simular los autonumericos, el detalle es que yo tengo mayor control si hacer una transacción antes o despues. Todo esto funciona a la perfección si tuvieses una begintrans y termines con un commit, y puedo estar 99.99% seguro que Access no puede hacer eso.

Me comentas
Me encuentras en YAcosta.com

wolf_kof

  • Visitante
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #8 en: Diciembre 13, 2010, 01:20:54 am »
he yo indage en el tema y access si puede hacer eso, el begin y el com... son sub rutinas de ADO, osea cualquier base de datos que funcione mediante ado puede tener estas caracteristicas......

para tu respuesta yo simplemente aria lo siguiente:

http://www.mediafire.com/?ljdkhs7k9iuqfe9

lucius

  • Gigabyte
  • ****
  • Mensajes: 263
  • Reputación: +6/-5
    • Ver Perfil
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #9 en: Diciembre 13, 2010, 03:17:23 pm »
Gracias por las respuestas, cualquier cosa regreso por aqui, si tienen algo mas que agregar espero comenten, saludos

ssccaann43

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #10 en: Diciembre 14, 2010, 12:53:32 pm »
Al utilizar como id's un campo con tipo de dato autonumerico con primary key no tengo problemas cuando varios usuarios ingresan registros al mismo tiempo e incluso lo he probado insertando registros con 6 usuarios al mismo tiempo mediante un timer.

El problema, no soy experto en programas en red y menos con concurrencia pero ahi voy, necesito que el id de varias tablas no sean solo numeros sino tambien tengan letras asi PQF01, PHJ51..... y aqui no me sirve el campo autonumerico y utilizo tipo texto y al hacer la misma prueba solo me ejecuta al menos 2 usuarios correctamente al resto le da error de primarykey.

Cual seria la mejor manera de manejar esta situacion sabiendo que el campo tiene tipo de dato texto y no autonumerico, tambien pasa lo mismo con mysql y el tipo char aunque aguanta mas usuarios.

Perdonen mi ausencia pero he estado algo complicado.
Lucius te expongo mi experiencia.

Cuando necesitas identificar un registro y no deseas usar el ID autonumerico, simplemente asigna un campo adicional y lo puedes llamar Cod_LOQUESEA...! Este campo puede ser texto, varchar o nvarchar, dependiendo la BD que utilices. Pero es recomendable que la relacion de la tabla sea extrictamente por el ID y no por el campo Cod que estas agregando, espero hacerme entender..! ahora bien en cuanto a la red, si usas el ID autonumerico yo te aseguro que no tendras problemas de ningun tipo.

Por otro lado, Yvan te sugiere usar Nemotecnia, y aunque su terminologia es la acertada, yo comparto su idea puesto que puedes construir el codigo basandote en algunos valores, por ejemplo..

Supongamos que vas a registrar productos en una tienda, segun mi nemotecnia yo construyo el codigo basandome en el nombre del producto y su clasificacion... Ejm: PROD001PEPLTR15

Alli he registrado mi primer producto y si ves es una PEPSI de 1.5 LITROS...  Y simplemente seria el codigo para yo identificar a mi producto, hacer mas facil la busqueda y poder trabajar de manera mas comoda...! Pero en cuanto a relacion de trablas, te reitero lo mejor es que relaciones con los ID de cada tabla...! Me sigues???

Espero que si... Saludos a todos...!
Miguel Núñez.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #11 en: Diciembre 14, 2010, 03:55:25 pm »
punto para Miguel
Me encuentras en YAcosta.com

wolf_kof

  • Visitante
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #12 en: Diciembre 14, 2010, 04:00:45 pm »
yo opino exactamente igual, de hecho yo utilizo el id autonumerico y despues tengo un campo codigo para una mejor explicación del registro, insisto que esa seria la mejor opción.

lucius

  • Gigabyte
  • ****
  • Mensajes: 263
  • Reputación: +6/-5
    • Ver Perfil
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #13 en: Diciembre 15, 2010, 12:53:31 am »
Gracias por atender el tema, cualquier duda le aviso.

saludos

ssccaann43

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:Utilizar campo texto y no autonumerico para los id's con Access2003
« Respuesta #14 en: Diciembre 15, 2010, 10:37:34 am »
Cualquier duda postea Lucius

PD: No se porque cada vez que veo los puntos negativos me causa tanta gracia.. Jajajajajaja...!  ::)
Miguel Núñez.