Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Generar números de serie consecutivos para productos (https://www.clubdelphi.com/foros/showthread.php?t=90383)

ronalg 27-05-2016 21:39:11

Generar números de serie consecutivos para productos
 
Buenas tardes, estoy refinando un programa de compras, ventas y almacenes y necesito ayuda con algo; se trata de que al vender/comprar un producto determinado al por mayor se debe registrar los numeros de serie de los productos uno por uno, siendo que el contenido de una cada de dichos productos tiene las series en secuencia, es muy moroso pasar por el escaner los prosductos.

para esto se me ocurrio (obviamente) hacer un menu meno flotante (TPopupmenu) que entre otras opciones tiene la de "Autocompletar Serie" hasta ahi todo ok, la serie se almacena en un campo varchar(30) (Ojo yo no hice el sistema lo mejoro) , pero cuando vi los tipos de series que manejan dentro de la tienda vi que habian series: NUMERICAS Y ALFANUMERICAS (LO PERO CON TERMINACION EN LETRAS - ESAS SON LAS PROBLEMATICAS)

Se me ocurrio (y esta es mi duda) si puedo convetir el "nro de serie" que es string a binario y de ahi sumarle en un bucle "1" para obtener el siguiente codigo en binario convertirlo nuevamente a string y almacenarlo en la tabla y asi autocompletar las series consecutivas.

¿Es esto factible? (soy neofito en manejo de binario)

Cita:

Según lo que supongo:

Tengo serie = AF005t9843A en binario podria ser 11010010110101010111101111 por decir algo.

Le sumo uno (tampoco se como hacerloen delphi) osea 11010010110101010111110000

Y "Vuala" lo convierto a string nuevamente y "según yo" deberia obtener AF005t9843B.

Espero que se posible

si lo fuera

¿Como convierto un string a binario y lo regreso a string despues de sumarle 1?

Si no lo fuera

¿Que sugerencia me harian?

Mil gracias de antemano

mamcx 27-05-2016 22:28:52

La solución que piensas es de lo mas raro que he escuchado hoy!

Lo triste es que escuchamos ideas mas raras todo el tiempo ;)

-----

La solución a los problemas no es buscando evadirlo. Es preguntándose:

1- Cual es el *verdadero* problema
2- Es posible *eliminar* la necesidad de tener que "solucionarlo"? (Como el chiste: Me duele cuando me toco la nariz... entonces deja de tocarte la nariz!)

Si no tienes claro el problema, terminaras creando una solución ingeniosa para un problema distinto.

-----

El problema es este: Porque las series son asi. Pueden cambiarse a algo mas simple? Estan usando un estandar de codigo de barras? Como sea, debes entender el porque asi son las series, y como es su funcionamiento. Solo entonces podras ver como resolver el problema.

Y aunque parece muy obvio el que "generar los números" sea una solución, preguntate: PORQUE es un problema usar la herramienta de lector de barras? PORQUE es mejor hacerlo como dices? Acaso hay otro problema de fondo?

Ponle animo a hacer muchas preguntas cuando surge un problema. Aun cuando probablemente llegas a la misma conclusion que haciendolo mas ingenuamente, el resultado sera MUCHO mas efectivo.

----

P.D:

1- Si se puede convertir cadenas a binarios y viceversa en Delphi. Busca en google como
2- No, esa no es la forma de hacer lo que buscas, pero es claro que tampoco entiendes el tema de los binarios. Hay varios videos en youtube muy esclarecedores al respecto. Ademas, es SUPER importante que aprendas como se codifica/decodifica la informacion (osea: Pasar de un formato a otro). Pon eso en tu lista de cosas por reforzar

rocksoft 27-05-2016 23:21:00

Hola ronalg,

una opcion es que le pidas a tu proveedore que te mande un listado de los numeros de serie que os estan entregando, ya que ellos supuestamente deberian de tenerlos registrados. Y solo los importas.


Por los general los numeros de serie contienen algun tipo de algoritmo, como es el codigo EAN, si te lo quieres hacer comodo sin mucha complicacion, asi al menos sabes como se compone el numero y si quieres le agregas dos numeros para verificar la integridad del numero.

AÑO MES DIA NUMEROPRODUCTO SERIE
AAAAMMDDPPPPPPPPPSSSSS
2016 05 27 000001234 0001

ASAPLTDA 28-05-2016 16:41:16

Generacion Series
 
Podrias compartir un grupo de series para buscar una solucion al problema?

AF005t9843A
AF005t9843B
AF005t9843C
...
AF005t9843Z
Si llega a Z sigue la series asi?
AF005t9844A
AF005t9844B
..
Porque si es asi una posible soluccion seria
reemplazar el ultimo caracter posicion 11 con la siguiente letra que seria por decir la C y asi sucesivamente
ahora las letras tienen un orden conocido ejemplo A=1 B=2, C=3 ... Z +/- 23 lo que es una sucesion

Espero que te pueda ayudar en algo

rastafarey 30-05-2016 02:27:23

Podrías octener el código ascii de cada carácter para luego llevarlo a binario de largo fijo, y luego sumar un 1, lo cual no garantiza que sea un serie. Por ejemplo si el íntimo caracter en una A sabemos que su valor ascii 65 si le sumas 1 te daría 66 al llevarlo nuevamente a caracter te daria una B, pero que pasa si es una Z al sumarle uno te daria una cosa diferente a lo que esperas, igual si el un numero. Te recomiendo que veas como se genera las series.

Enviado desde mi SM-G900H mediante Tapatalk

ronalg 30-05-2016 23:25:13

Gracias por responder
 
Aclaro un poco el problema:

Al vender un producto ocurre que piden una venta de 8 unidades de la caja de 10, estas 8 unidades tienen números de series consecutivos (del cual el formato es irrelevante pues existen productos de todo tipo), por decirles el primer nro de serie es 462175483
y obviamente los otros 7 serán 462175484 - 462175485 - ......... - 4621754890, en "ventana de registro de la venta" (se ha pedido = orden del jefe de sistemas) que se coloque un botón o un menú emergente o lo que sea que haga el trabajo de "Auto completar Series", esto sería que el usuario escanea o escribe el primer nro de serie y al presionar el sugerido botón las otras series se generen automáticamente (y obvio se inserten en el listado de series que salen del sistema); este es el problema.
Cuando las series tienen terminación numérica no hay problema pues aislamos la parte numérica de la parte alfabética incremento la parte numérica y volvemos a juntar ambas partes. Cuando la terminación es alfanumérica por decirles ASDF653214T; el auto completar las 8 series daría ASDF653214U - ASDF653214V - ASDF653214W - ASDF653214X - ASDF653214Y - ASDF653214Z - ASDF653215A - ASDF653215B, el asunto se complica si existieran series con los dos últimos elementos literales.

Por ahora encontré una solución (gracias rastafarey y ASAPLTDA combinare sus dos sugerencias) que es convertir a binario la serie (o talvez el último dígito) y sumar uno al ultimo bit, así garantizo la sucesión pero cuando llegamos a la "Z" o a la "z" no regresa a la letra "A"; salta a "[" o a "{" con lo cual debo controlar solo el digito que cambia (en eso estoy) que el siguiente código salte a "A" o a "a".

Posiblemte me este complicando mucho y exista una forma de resolver de “forma administrativa” el problema pero bueno los jefes no siempre entiende, algunos solo saben pedir y dar fechas limites a pesar de que uno dé razones muy lógicas (muy personalmente me parece que deberían escanear la serie producto por producto, incluso para verificar, por seguridad, las series).

Mil gracias por la ayuda, cuando termine la función la publicare por si a alguien le puede ser útil.

mamcx 30-05-2016 23:47:40

Estas complicando mucho el tema, y es muy simple.

Como lo haces a mano? Manualmente? En tu mente?.

De hecho, te doy una pista mejor: Como cuentas con los dedos mas de 10?

Usas un acumulador y *repites todo desde el principio*. Es muy simple, pon las letras en una lista:

a.b.c.....

Arrancas del inicio, brincas +1 y al llegar al final, ACUMULAS y reinicias otra vez. No tienes que hacer cosas raras ni validar que salgas del rango, porque tienes la lista, es conocida y finita y facil de generar!

P.D: Y recuerda que delphi tiene el tipo de datos perfecto:

http://www.delphibasics.co.uk/RTL.asp?Name=Set

ronalg 01-06-2016 22:45:46

No debí llamarle "generar series" debí llamarlo "auto completar series"
 
1 Archivos Adjunto(s)
MIL GRACIAS YA LO RESOLVÍ, AHÍ LES VA POR SI A ALGUIEN LE SIRVE.

Código Delphi [-]
var
  serie: string;
  finales:set of char = ['Z','z','9'];
  iniciales: set of char = ['A','a','0'];

function siguiente_serie(serie_base: string; longitud: byte): string;
var caracter, caracter_s:char;
begin
     caracter:=serie_base[longitud];
     caracter_s:=caracter_siguiente(caracter);
     if (caracter_s in iniciales) then
     begin
          serie_base:=siguiente_serie(copy(serie_base,0,longitud-1),longitud-1);
     end;
     result:=copy(serie_base,0,longitud-1)+caracter_s;
end;

function caracter_siguiente(caracter_base: char): char;
//var caracter_s:char;
begin
     if caracter_base in finales then
     begin
          case caracter_base of
          'Z': result:='A';
          'z': result:='a';
          '9': result:='0';
          end;
     end
     else
     begin
          //caracter_s:=char((ord(caracter_base)+1));
          result:=char((ord(caracter_base)+1));
     end;
end;

{Usando en un StringGrid name=sg_series rowcount=10}

procedure TForm1.BitBtn1Click(Sender: TObject);
var nueva_serie:string;
    i:integer;
begin
     for i:=2 to sg_series.RowCount-2 do
     begin
          serie:=sg_series.Cells[0,i-1];
          nueva_serie:=siguiente_serie(serie,length(serie));
          sg_series.Cells[0,i]:=nueva_serie;
     end;
end;

FALTA DEPURAR ALGUNAS COSAS PERO FUNCIONA


La franja horaria es GMT +2. Ahora son las 00:52:03.

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