Ir al contenido


Foto

¿Cómo identificar un campo autoincrementable?


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

#1 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 13 octubre 2010 - 11:17

Continuando con mi problema actual...

Tengo éste código en la forma padre de mi proyecto:


delphi
  1. procedure TDts.Edit;
  2. var
  3.   i : Integer;
  4. begin
  5.   clndsDts.Edit;
  6.   for i := 0 to clndsDts.FieldCount - 1 do
  7.   begin
  8.     clndsDts.Fields[ i ].AsString := Trim( clndsDts.Fields[ i ].AsString );
  9.   end;
  10. end;



Buscando en la ayuda de Delphi 7, encontré el tipo de campo fkInternalCalc e intenté añadirlo a mi código:



delphi
  1. procedure TDts.Edit;
  2. var
  3.   i : Integer;
  4. begin
  5.   clndsDts.Edit;
  6.   for i := 0 to clndsDts.FieldCount - 1 do
  7.   begin
  8.     if clndsDts.Fields[ i ].FieldKind <> fkInternalCalc then
  9.       clndsDts.Fields[ i ].AsString := Trim( clndsDts.Fields[ i ].AsString );
  10.   end;
  11. end;



Pero no me identifica el campo autoincrementable (Identity) de la tabla que estoy abriendo.

¿Alguna idea de cómo puedo identificar un campo autoincrementable de MS SQL Server 2005?
  • 0

#2 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 13 octubre 2010 - 11:30

Por si de algo sirve, las tablas están definidas así:


sql
  1. CREATE TABLE [dbo].[CtlClbArm](
  2.     [ClvClbArm] [INT] IDENTITY(1,1) NOT NULL,
  3.     [DscClbArm] [VARCHAR](50) NOT NULL
  4. ) ON [PRIMARY]


  • 0

#3 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 13 octubre 2010 - 11:32

No creo que haya ninguna propiedad en Delphi que te indique eso. Personalmente lo que hago es seguir siempre una misma estructura sencilla, que es que los campos primarios de mis tablas (es decir, los autoincrentales) sean el primer campo de todos.

De forma que tu código quedaría :



delphi
  1. procedure TDts.Edit;
  2. var
  3.   i : Integer;
  4. begin
  5.   clndsDts.Edit;
  6.   for i := 1 to clndsDts.FieldCount - 1 do  // Nos saltamos el campo 0 (Autoincremental)
  7.   begin
  8.     clndsDts.Fields[ i ].AsString := Trim( clndsDts.Fields[ i ].AsString );
  9.   end;
  10. end;


  • 0

#4 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 13 octubre 2010 - 11:35

No creo que haya ninguna propiedad en Delphi que te indique eso. Personalmente lo que hago es seguir siempre una misma estructura sencilla, que es que los campos primarios de mis tablas (y por lo tanto los autoincrentales) sean el primer campo de todos.

De forma que tu código quedaría :



delphi
  1. procedure TDts.Edit;
  2. var
  3.   i : Integer;
  4. begin
  5.   clndsDts.Edit;
  6.   for i := 1 to clndsDts.FieldCount - 1 do  // Nos saltamos el campo 0 (Autoincremental)
  7.   begin
  8.     clndsDts.Fields[ i ].AsString := Trim( clndsDts.Fields[ i ].AsString );
  9.   end;
  10. end;



Gracias, Marc..., la solución también ya la habíamos pensado los compañeros de la oficina y yo, pero como ésta es una función que se aplica A TODOS los TClientDataSet's que componen el proyecto, no estamos seguros qué tanto afectará a otras pantallas del mismo...

Y como estamos trabajando en equipo, difícilmente se puede optar por una solución que genere problemas en otro lugar. Pero sí, prometo ponderarla para su posible aplicación.
  • 0

#5 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 13 octubre 2010 - 11:59

Saludos.

TiammatMX, observa este artículo a ver si te ayuda!
  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 14 octubre 2010 - 07:52

Ensaya con esto usando la propiedad DataType y no FieldKind



delphi
  1. procedure TDts.Edit;
  2. var
  3.   i : Integer;
  4. begin
  5.   clndsDts.Edit;
  6.   for i := 0 to clndsDts.FieldCount - 1 do
  7.   begin
  8.     if clndsDts.Fields[ i ].DataType<> ftAutoInc then // o tambien ftInteger
  9.       clndsDts.Fields[ i ].AsString := Trim( clndsDts.Fields[ i ].AsString );
  10.   end;
  11. end;



Aunque yo comparararía mejor los tipo string para poder aplicar la función Trim, para que no se vean involucrados los campos de fechas, booleanos, etc.




delphi
  1. procedure TDts.Edit;
  2. var
  3.   i : Integer;
  4. begin
  5.   clndsDts.Edit;
  6.   for i := 0 to clndsDts.FieldCount - 1 do
  7.   begin
  8.     if clndsDts.Fields[ i ].DataType = ftString then //
  9.       clndsDts.Fields[ i ].AsString := Trim( clndsDts.Fields[ i ].AsString );
  10.   end;
  11. end;



  • 0

#7 rmejia

rmejia

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 25 septiembre 2013 - 02:55

basta en un query poner el siguiente codigo

SELECT  c.name FROM syscolumns c, sysobjects o WHERE c.STATUS & 128 = 128
AND o.id = c.id AND o.name= nombre_de_la_tabla

el nombre de la tabla pasalo como string

te devuelve el campo identity
  • 0




IP.Board spam blocked by CleanTalk.