Ir al contenido


Foto

La mejor manera de realizar esta situación


  • Por favor identifícate para responder
12 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 marzo 2009 - 02:28

Hola amigos, necesito consejos y/o ayuda de cómo realizar esta situación, tengo una tabla donde hay un campo incremental (1,2,3...N) y otro para el número de factura (ejemplo: 5555/09, No./año), ahora bien, el cliente que usa el sistema genera el número de factura por año, es decir, 01/09, 02/09 hasta donde llegue al 31/12/2009, pero en el 2010 la cuenta debe empezar de nuevo, 01/10, 02/10...etc, pero con el año correspondiente, quisiera saber ¿cómo harí­an ustedes que esa situación sea de manera automática?, con ejemplos eh  8o| :p.

Saludos.
  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 21 marzo 2009 - 09:29

a ver yo lo manejaria de esta forma



delphi
  1. if UltimoMesInicializado <> MesActual then
  2.   Iniciocontador;
  3.  
  4. LeoContador;


  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 21 marzo 2009 - 09:34

¿Tan sencillo no?  8-), gracias eduardo.
  • 0

#4 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 21 marzo 2009 - 09:39

que tiene de malo lo sencillo?  8-)

me falto colocar que cuanto inicializas el contador inicias el ultimo mes...
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 21 marzo 2009 - 11:53

Hola Fernando,
Anoche vi el hilo y me quedé pensando. Tengo mis dudas y reservas sobre el tema... y viendo lo que comenta Eduardo debo decir ¡Momento!¡Paren el carro!

Antes que nada pregunto: ¿Es buena idea reiniciar la secuencia autonumérica? ;) Se supone que el autonumérico es único.

¿En que medida esto puede afectar al diseño de tu base de datos? ¿Cómo está estructura tu base de datos?

En tu descripción nos comentas que tienes un campo autoincremental para las facturas, y luego tienes otro destinado para una tabla ¿Que tabla? *-) Si estos mismos campos actuan de clave primaria y/o foráneas veo una practica peligrosa la de reiniciar el contador.

Si no es mucha molestia para comprender mejor el tema... ¿podrí­amos conocer un poco más del tema? ¿Es posible ver una diseño del DER o MER?

En cuanto al aspecto lógico, conceptualmente, es similar a como menciona eduardo. Ahora bien, hay que analizar en que medida se puede garantizar la integridad y consistencia de los datos.
Por lo que entiendo, se reinicia la cuenta de factura con el inicio del año... si es así­:


delphi
  1. if AnioActual <> UltimoAnio
  2.   then begin
  3.           reiniciarNumeracionFacturas;
  4.           UltimoAño := AnioActual;



Esta lógica se puede llevar dentro del sistema o la base de datos, o bien de forma conjunta entre sistema y base de datos. Tal vez el uso de triggers, procedimientos almacenados y otros elementos puedan ser últiles.

Saludos,

  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 21 marzo 2009 - 12:07

Antes que nada pregunto: ¿Es buena idea reiniciar la secuencia autonumérica? ;) Se supone que el autonumérico es único.


Hola Delphius, no, no es el campo autoincremental la que se reiniciará sino el otro campo que mencioné para esos fines.

En tu descripción nos comentas que tienes un campo autoincremental para las facturas, y luego tienes otro destinado para una tabla ¿Que tabla? *-) Si estos mismos campos actuan de clave primaria y/o foráneas veo una practica peligrosa la de reiniciar el contador.


No amigo, creo que leí­ste mal, dije que tengo UNA tabla con esos dos campos uno incremental y el otro para generar la numeración de la factura.

Si no es mucha molestia para comprender mejor el tema... ¿podrí­amos conocer un poco más del tema? ¿Es posible ver una diseño del DER o MER?


Me vas a perdonar, pero desconozco lo que es DER o MER :$.

Saludos.
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 21 marzo 2009 - 12:30

Hola Fernando,
Gracias por las aclaraciones.

DER = Diagrama Entidad-Relación
MER = Modelo Entidad-Relación

Es lo mismo, algunos lo llaman DER; otros DER.
Es el diseño en donde se establecen visualmente las relaciones entre las tablas. Por ejemplo, éste.

Saludos,
  • 0

#8 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 21 marzo 2009 - 03:03

Delphius, entiendo sobre manera tu preocupacion por la integridad de los datos, de hecho se me ocurren muchas razones para no hacerlo, pero hay una sola de peso, "el cliente lo quiere"

Tal como lo hizo Fernando no debe dar mucho problema, ya que la clave real si es correlativa, ese lo toma como un campo mas para satisfacer al cliente.
  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 21 marzo 2009 - 04:00

No digo que esté incorrecto, yo más bien prefiero pensarlo dos veces.

Tal vez sea el "cliente quien lo pide" un motivo, pero creo que se puede ofrecerle un diseño y una solución que sea compatible con lo que necesita sin necesidad de recurrir a un reinicio.

Como dices, es un campo más. Y si, tal vez no le cause problemas y es una solución económica.

Disculpen si yo antes he entendido algo mal.

Saludos,
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 21 marzo 2009 - 04:40

Disculpen si soy molesto...
Es más, no es necesario disponer de un auto-incremental. Veamos... la información ya está ¿o no? El asunto es que al cliente no es la representación más adecuada. Entonces que hacemos, se la damos.

Se puede disponer de un trigger after insert que "calcule" el campo:

1) Lanzamos una consulta para saber la cantidad de registros del año en curso
2) Guardamos el valor en una variable, a falta de imaginación la llamo N.
3) Operamos:

3.1. El numero de registro de factura es N+1. Nro = N + 1.
3.2. Para el año tomamos los dos caracteres finales y lo almacenamos en Año.
3.3. Guardamos el valor del campo en cuestión con el formato Nro/Año.

Y como ven, nada de campos autoincrementales, reseteos, un simple trigger se encarga de "calcular" el campo a medida que se van ingresando. Luego tras una consulta uno puede mostrar el campo sin problemas.

No se si se me entiende. Tengo otras ideas, pero son un poquito más complicadas.
Saludos,
  • 0

#11 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 21 marzo 2009 - 08:16

me gusta esa idea, elimina el problema que se ocasionaria si retrasan la fecha...
  • 0

#12 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 mensajes

Escrito 23 marzo 2009 - 08:27

Secundando a Marcelo, entiendo que cada factura debe tener un campo Fecha.  Siendo así­, propongo que la estructura de la tabla tenga estos primeros campos:

ID.- Integer de llave primaria.
Fecha.- TimeStamp para fecha y hora de la factura.
Numero.- SmallInt para número consecutivo por año.
NumeroFormato.- Computado, concatenación del año del campo Fecha con el campo Numero bajo el formato que sugiera el cliente.

Con un disparador (trigger) Before Insert, para establecer el campo Numero en base al año del campo Fecha (último número de ese año más uno).

Dentro del disparador, la sentencia de asignación serí­a algo como:


sql
  1.   -- Obtener el siguiente número de factura del año
  2.   SELECT COALESCE (MAX (Numero), 0) + 1 FROM Factura WHERE EXTRACT (YEAR FROM Fecha) =
  3.     EXTRACT (YEAR FROM NEW.Fecha) INTO NEW.Numero;



Esto lo analicé con Firebird, sólo habrí­a que adaptarlo a las caracterí­sticas de MySQL.

Espero te sea de utilidad, Fernando:)

Saludos.

Al González.
  • 0

#13 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 marzo 2009 - 09:13

Muchas gracias Al, ya lo tengo anotado ;) (y).

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.