Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Generar codigo en SQL Server (https://www.clubdelphi.com/foros/showthread.php?t=86276)

camiz 12-07-2014 06:48:47

Generar codigo en SQL Server
 
Hola amigos del foro, quiero que me ayuden con esto:
Les comento que estoy trabajando en una aplicacion que va a trabajar en red y la base de datos es SQL server.

lo que pasa es que tengo una duda con los clientes al momento de registrarlos, lo que hago es generar un codigo de cliente ejem
000001, este codigo lo genero de un campo de la tabla clientes y lo muestro en un TEdit en el form, hasta ahi bien.
supongamos que mientras yo estoy llenando el resto de informacion del cliente otro usuario tambien quiere dar de alta otro cliente el codigo que va a generar va a ser el mismo 000001.
¿ Como hago para decirle al otro usuario que el codigo 000001 es mio y por lo tanto el tiene que generar el 000002 ?

estoy utilizando este codigo para coger el numero mas alto del campo en delphi, pero que tengo que hacer con SQL Server. Estoy utilizando la version 2012 Express.

Código Delphi [-]
with frmConeccion.Codigos_Gen do
begin
  SQL.Clear;
  Close;
  SQL.Text := 'Select max(CODIGO) as CODIGO from CLIENTES';
  Open;
  txtcodigo.text := FloatToStr(FieldByName('CODIGO').AsInteger +1);
  Close;
  Active := False;
end;

olbeup 14-07-2014 10:24:39

Cita:

Empezado por camiz (Mensaje 478903)
Hola amigos del foro, quiero que me ayuden con esto:
Les comento que estoy trabajando en una aplicacion que va a trabajar en red y la base de datos es SQL server.

lo que pasa es que tengo una duda con los clientes al momento de registrarlos, lo que hago es generar un codigo de cliente ejem
000001, este codigo lo genero de un campo de la tabla clientes y lo muestro en un TEdit en el form, hasta ahi bien.
supongamos que mientras yo estoy llenando el resto de informacion del cliente otro usuario tambien quiere dar de alta otro cliente el codigo que va a generar va a ser el mismo 000001.
¿ Como hago para decirle al otro usuario que el codigo 000001 es mio y por lo tanto el tiene que generar el 000002 ?

estoy utilizando este codigo para coger el numero mas alto del campo en delphi, pero que tengo que hacer con SQL Server. Estoy utilizando la version 2012 Express.

Código Delphi [-]
with frmConeccion.Codigos_Gen do
begin
  SQL.Clear;
  Close;
  SQL.Text := 'Select max(CODIGO) as CODIGO from CLIENTES';
  Open;
  txtcodigo.text := FloatToStr(FieldByName('CODIGO').AsInteger +1);
  Close;
  Active := False;
end;

Hola camiz,
Cambia el
Código Delphi [-]
textcodigo.text := FloatToStr(FieldByName('CODIGO').AsInteger +1);
por el
Código Delphi [-]
textcodigo.text := FormatFloat('000000', StrToInt(FieldByName('CODIGO').AsInteger +1));

Un saludo.

Ferrari 14-07-2014 23:42:04

Sql
 
Te recomiendo que manejes transacciones para SQL y asi te evitas que si tu tomaste el 1 y el sigue con el 2.....saludos

camiz 15-07-2014 04:26:25

Gracias, pense que la ayuda ya no llegaría. Creo que lo que necesito son transacciones para SQL, Gracias Ferrari.
gracias olbeup .

olbeup 09-04-2015 15:09:47

Hola Camiz,

También puedes definir el campo autoincremental.

Código SQL [-]
CREATE TABLE Clientes
  (
    IDCLIENTE   int IDENTITY(1,1) <-- Cada vez que añadas un registro, automáticamente se incrementa en 1
    ,APELLIDOS  varchar(25)
    ,NOMBRE     varchar(15)
    ,...
    ,...
  )
Un saludo.

mamcx 09-04-2015 17:36:01

Cita:

Empezado por camiz (Mensaje 478903)
¿ Como hago para decirle al otro usuario que el codigo 000001 es mio y por lo tanto el tiene que generar el 000002 ?

9 de cada 10, esa es la idea equivocada. Como te explicaron, la forma correcta es usar un campo autonumerico (IDENTITY en sql server) y dejar que la BD se encargue del tema.

Porque es equivocada?

Porque genera un punto de contención (= un cuello de botella) en la BD, asi que ha menos que tengas que *garantizar* por regulacion que hay un consecutivo fijo (como en ciertos paises con las facturas), no te pongas en esas.

Ademas, es *ideal* que las claves de las tablas *carezcan* de sentido en la logica de negocios, y solo sirvan como punteros para llegar al registro, hacer relaciones y demas. Son las claves naturales (como # de cedula, nombre pais) las que le importan al usuario, y esas tienden a ser unicas.

Ademas, hacer esto desde Delphi? eso ya ES TARDE. Del lado del cliente ya ha pasado tiempo (mas aun si el servidor se accede remoto) y pa rematar el usuario se puede ir a tomar un cafe o dejar un proceso a medias. Todo esto se debe hacer directamente desde el motor, para reducir el margen de contención.

Solo hay UN caso de uso donde se puede desde el cliente generar IDS: si estos son del tipo GUID o similares.

-----

Pa no dejarte en ascuas, la forma tradicional es usar una tabla de consecutivos (con tabla, campo, siguiente consecutivo), y con triggers se obtiene y aumentan los tales y se asignan al campo en particular.

Pero NO lo hagas si es solo algo "estetico" o por que si. Las facturas/documentos legales es quizas de los pocos casos donde es una solucion valida.

AgustinOrtu 09-04-2015 18:37:35

Yo hago algo similar, pero NUNCA mando como parametro ese "codigo" que le muestro en pantalla en un INSERT

Se lo presento ahi a modo de decirle, vas a cargar el cliente 531, por si despues lo quiere buscar rapidamente. Si cuando lo graba resulta que le toco el Id 540 se lo notifico y listo

Totalmente de acuerdo con el uso de columnas autonumericas

Neftali [Germán.Estévez] 10-04-2015 09:07:17

Cita:

Empezado por camiz (Mensaje 478903)
...este codigo lo genero de un campo de la tabla clientes y lo muestro en un TEdit en el form, hasta ahi bien.
supongamos que mientras yo estoy llenando el resto de informacion del cliente ...

Te diría (en la misma linea del resto de compañeros) que como primer cambio pases ese código (obtener el ID) al momento de grabar, no al de mostrar formulario.
Como segundo paso que utilices transacciones.
Y como tercero que pases esa lógica al SGBD.

Por ese orden.


La franja horaria es GMT +2. Ahora son las 20:03:42.

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