Códigos Incremental

Hola Buenos días.
Voy a tratar de explicarmr lo mejor posible.
Tengo por ejemplo un Formulario para cargar los cargos de empleados, en una tabla lllamada Cargos.dbf. Y en el cual tengo una caja de texto donde voy creando un cargo incremental para cada cargo, y en el cual utiliza las siguientes lineas de código para hacerlo:
Calculate Max(Cargo.Cod_Car) To Codigo
ThisForm.Text1.Value = Codigo + 1
Todo funciona muy bien el problema es que como la aplicación va a trabajar en una red y tengo las tablas relacionadas por un campo indice principal, cuando borro el ultimo registro con el ultimo código creado con la función delete ya que como tengo las tablas de modo compartida y no los puedo borrar permanentemente, cuando me va a generar el próximo código me calcula es el código que ya fue marcado, y cuando voy a guardar me da el error de viloación de código único
Me gustaría saber si me puedes orientar como puedo arreglar este problema, y disculpa por lo largo de la pregunta.
De antemanos muchas gracias si me puedes ayudar con eso.

1 Respuesta

Respuesta
1
Para este problema debes crear una función que te genere el valor máximo de la siguiente manera:
Crea una tabla nueva para la base de datos que podría llamarse Códigos con los siguientes campos:
NombreTebla Carácter 20
ValorClave Numérico 8
Ingresa los nombres de las tablas en el campo NombreTabla e inicializa el campo ValorClave con valor 1
En los procedimientos almacenados de la tabla pega el siguiente código:
Function Nuevo_Id(tcAlias) && Agrega un nuevo Id a la tabla seleccionada.
  Local lcAlias, lcId, lcOldReprocess, lcOldArea
  lcOldArea = Select()
  lcAlias = Iif(Parameters() < 1, Upper(Alias()), Upper(tcAlias))
  lcOldReprocess = Set('Reprocess')
  Set Reprocess to Automatic
  If !Used("Codigos")
    Use "Notas!Codigos" in 0    
  Endif
  Select Codigos
  If Seek(lcAlias, "Codigos", " NombreTabla")
    If Rlock()
      lcId = Codigos.ValorClave
      Replace Codigos.ValorClave with lcId + 1
      Unlock
    Endif
  Endif
  Select (lcOldArea)
  Set Reprocess to lcOldReprocess
  Return lcId
Endfunc
En formulario puedes utilizar el siguiente código
ThisForm.Text1.Value  =  Nuevo_Id("Cargos")
Esto también funciona en tablas abiertas en modo compartido y por lo tanto debería ser la solución al problema.
Hola Buenos días.
Voy a tratar de explicarmr lo mejor posible.
Tengo por ejemplo un Formulario para cargar los cargos de empleados, en una tabla lllamada Cargos.dbf. Y en el cual tengo una caja de texto donde voy creando un cargo incremental para cada cargo, y en el cual utiliza las siguientes lineas de código para hacerlo:
Calculate Max(Cargo.Cod_Car) To Codigo
ThisForm.Text1.Value = Codigo + 1
Todo funciona muy bien el problema es que como la aplicación va a trabajar en una red y tengo las tablas relacionadas por un campo indice principal, cuando borro el ultimo registro con el ultimo código creado con la función delete ya que como tengo las tablas de modo compartida y no los puedo borrar permanentemente, cuando me va a generar el próximo código me calcula es el código que ya fue marcado, y cuando voy a guardar me da el error de viloación de código único
Me gustaría saber si me puedes orientar como puedo arreglar este problema, y disculpa por lo largo de la pregunta.
De antemanos muchas gracias si me puedes ayudar con eso.
Hola Buenos días.
Entendi practicamente todo el codigo que me mandastes, lo que no entendi fue lo de:
* procedimientos almacenados de la tabla
*If Seek(lcAlias, "Codigos", " NombreTabla").
Otra cosita y disculpa la molestia, la aplicación que estoy realizando, va ha ser multiusuario, y en este tema estoy un poco falto de información, de verdad me gustaría mucho si me pudieras informar en cuanto a cuales son las principales pautas para programar una aplicación multiusuario, o un ejemplo que tengas por allí, ya que este va a generar un ticket de préstamo de materiales con un número, por lo cual no se como hacer para que cuando estén trabajando dos usuarios al mismo momento y vayan a imprimir el ticket no le salga impreso el mismo número de ticket a los dos, y también lo mismo lo que ingreso uno y lo que ingreso el otro, ya que como los datos se van a guardar en una tabla para poder crear el ticket con el genrador de reportes.
De antemano muchas gracia por tu ayuda, y disculpa las molestias
(xxxxxx)
(xxxxxx)
NombreTabla es el nombre del campo de la tabla códigos que te dije que crearas, en este campo se deben ingresar los nombres de las tablas (por ejemplo la tabla cargos, es decir debes ingresar el nombre de la tabla en mayúsculas "CARGOS" en este campo) a las que se les va a agregar un código incremental o consecutivo ah se me olvido decirte que establezcas este campo como índice ascendente, menos mal que volviste a preguntar.
La función seek buscará el nombre de la tabla que se le envió como parámetro en el campo NombreTabla y hace las operaciones en la función que te escribí en el anterior mensaje, procedo a describirte los parámetros:
= Seek(lcAlias, "Codigos", "NombreTabla")
LcAlias: contiene el nombre de la tabla que se buscará en la tabla códigos (ver la variable en la función descrita arriba).
Códigos: Hace referencia al nombre de la tabla en la que se buscará lcAlias (ver la variable en la función descrita arriba).
NombreTabla: Hace referencia al nombre del campo de la tabla códigos que contiene los nombres de las tablas a las que se les ingresará código incremental (ver la variable en la función descrita arriba).
Así es como funciona el código...
Muchísimas gracias, ahora si lo entiendo, voy aprovechar esta misma pregunta para preguntarte de otra duda, y esta si es la ultima, estoy usando la versión de FoxPro 9.0, ¿es verdad que para esta función si utilizas las tablas em modo Buffering no hace falta usar el Rlock() o Flock() ya que esta lo hace automáticamente?
De antemano muchas gracia por tu ayuda
Sí es verdad, en nivel 2 y 3 no es necesario, en nivel 4 y 5 debes llamar a la función TableUpdate().
Hola bunas tardes.
Una ultima cosita y disculpa el fastidio, la función que me mandaste anteriormente para crear el código incremental, ¿dónde la coloco? ¿En un prg o en alguna parte del formulario?
Gracias por tu ayuda y de verdad esta si es lo ultimo con esto
La colocas en los procedimientos almacenados de la base de datos...
Bueno si te soy sincero no se a que te refieres con: procedimientos almacenados de la base de datos
En el administrador de proyectos selecciona la ficha datos, luego selecciona la base de datos de tu proyecto.
Haz clic en el botón modificar (se abre la base de datos en modo de diseño).
En el menú base de datos selecciona modficar procedimientos almacenados (se abre la ventana de procedimientos almacenados).
Pega el código que te envié al comienzo de la ventana.
Cierra la ventana y listo...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas