Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Maxima valor de un nuevo registro (https://www.clubdelphi.com/foros/showthread.php?t=45803)

Arturo_ 13-07-2007 21:55:29

Maxima valor de un nuevo registro
 
// Versión: 10.0000 - © 1980, 2006 For Tables DELPHI SERVER .DB
// Ejecutar en: El Evento <Table.BeforePos> ****
// Función que Extrae el Valor Maximo para un Nuevo Registro Key
// Ejemplos:
// Form_DDBTLM.ASSEMBLY_RECORD_MaxKey(Table_NN, 'LINK_0001');
// Form_DDBTLM.ASSEMBLY_RECORD_MaxKey(Table_NN, 'LINK_0002');
// Form_DDBTLM.ASSEMBLY_RECORD_MaxKey(Table_NN, 'LINK_0003');
Código Delphi [-]
procedure TForm_DDBTLM.ASSEMBLY_RECORD_MaxKey(var pmt_TABLE: TTable; pmt_FIELD: string);
begin
  // Init_PROPERTIES
  if (Table_ARMK.Active) then Table_ARMK.Close;
  Table_ARMK.Filter := '';
  Table_ARMK.Filtered := False;
  Table_ARMK.IndexFieldNames := '';
  Table_ARMK.MasterFields := '';
  Table_ARMK.MasterSource := nil;
  // Assign_PROPERTIES
  Table_ARMK.DatabaseName := pmt_TABLE.DatabaseName;
  Table_ARMK.SessionName := pmt_TABLE.SessionName;
  Table_ARMK.TableName := pmt_TABLE.TableName;
  Table_ARMK.MasterSource := pmt_TABLE.MasterSource;
  Table_ARMK.MasterFields := pmt_TABLE.MasterFields;
  if (Table_ARMK.MasterFields = '') then
    Table_ARMK.IndexFieldNames := pmt_FIELD
  else
    Table_ARMK.IndexFieldNames := Table_ARMK.MasterFields + ';' + pmt_FIELD;
  // Open_TABLE
  Table_ARMK.Open;
  Table_ARMK.Last;
  // Load_RECORD_KEY
  if (Table_ARMK.RecordCount = 0) then
    pmt_TABLE.FieldByName(pmt_FIELD).AsFloat := 1
  else
    pmt_TABLE.FieldByName(pmt_FIELD).AsFloat := Table_ARMK.FieldByName(pmt_FIELD).AsFloat + 1;
  // Close_TABLE
  Table_ARMK.Close;
end;
(*
Lo que hace este modulo es extraer el numero maximo del ultimo registro grabado luego le suma 1 para el nuevo registro esto funciona con una tabla ó tables master detalle. Lo bueno es que no uso campos incrementales porque a medida que se agranda la tabla puede que la inserción de registros sean lentos con este codigo añadir el registro 1,000,000,000 seria como añadir el primer registro de una tabla en blanco.

Form_DDBTLM.ASSEMBLY_RECORD_MaxKey(Table_NN, 'LINK_0003');

Table_NN - Se pasa todo el componente de la Tabla
LINK_0003 - Es el campo que contendra el ultimo valor del registro.

Los campor LINK_0001 y LINK_0002 son los enlaces de la tabla Padre

*)

marcoszorrilla 13-07-2007 22:01:23

Lo que haces quedaría más simple utilizando SQL, con un simple:

Código Delphi [-]
Select Max(Campo) From Tabla


Un Saludo.

Arturo_ 13-07-2007 22:03:32

SQL simple pero lento
 
Con SQL llegado el registro 100,000 seria demasiado lento a ver has la prueba con una tabla y genera 500,000 registros y veras que SQL es la peor opcion

marcoszorrilla 13-07-2007 23:09:06

Yo en realidad no utilizo la peor solución, yo guardo el último número en una tabla auxiliar que solamente contiene un registro y símplemente consulto dicha tabla le añado uno a dicho número y luego si se consolida la grabación le incremento.

Un Saludo.

jhonny 14-07-2007 02:21:41

Para tener mas de 500000 registros en una tabla, prefiero no usar tablas planas y como yo utilizo FireBird entonces hago uso de los generadores autoincrementales y ya.

Al González 14-07-2007 05:54:09

¡Hola a todos!

Cita:

Empezado por Arturo_
Con SQL llegado el registro 100,000 seria demasiado lento a ver has la prueba con una tabla y genera 500,000 registros y veras que SQL es la peor opcion

Que alguien me desmienta si estoy equivocado. Pero ¿qué eso no se arreglaría poniéndole un índice a la tabla sobre el campo en cuestión?

Lo digo porque he notado cómo un Order By se vuelve súper rápido cuando el campo está indexado, ¿no debería suceder lo mismo al usar la función Max? (hablo de una base de datos cliente-servidor, obviamente)

Un abrazo mejor.

Al González. :)

Arturo_ 23-07-2007 15:49:05

ESTE SR. DICE:
Yo en realidad no utilizo la peor solución, yo guardo el último número en una tabla auxiliar que solamente contiene un registro y símplemente consulto dicha tabla le añado uno a dicho número y luego si se consolida la grabación le incremento.

YO LE RESPONDO QUE:
Mira mi rutina sirve de forma dinamica porque, porque si tienes 30 tablas creadas para cada tabla y para cada sub-enlace de tabla hija tienes que tener una tabla auxiliar: Ejemplo si tienes 50 tablas tendrias que crear 50 tablas mas auxiliares, pero con mi rutina no creas ninguna tabla auxiliar es un procedimiento que genera solo dos tablas en forma dinamica y listo.
asi que tu SQL es la peor opción. Y el increment es lento cuando las tablas son demasiado grandes.

jhonny 23-07-2007 16:03:10

Cita:

Empezado por Arturo_
asi que tu SQL es la peor opción.

Marcos, me corregirá si estoy equivocado. Pero creo que cuando él se refería a la peor solución, se estaba expresando en tus mismas palabras...

Cita:

Empezado por Arturo_
Con SQL llegado el registro 100,000 seria demasiado lento a ver has la prueba con una tabla y genera 500,000 registros y veras que SQL es la peor opcion

Definitivamente, hay gente que vive a la defensiva :)

marcoszorrilla 23-07-2007 22:14:32

Efectivamente como dice jhonny estoy parafraseando las propias palabras del autor de la frase, en ningún modo se trata de ofender a nadie. Símplemente yo digo que no uso la "llamada peor solución", en la cual no entro ni salgo, pues cada uno tiene derecho a manifestar su opinión como le convenga y quien vaya a aplicar la posible solución verá enriquecida la respuesta que esperaba con varias soluciones, que solamente él dirá cual le conviene o cual rechaza o cual considera la peor, aunque opte por considerar la peor la que yo que yo mismo he dado.

Además según veo eres tú mismo quien dices que mi respuesta es la peor solución, lo cual ya digo es normal todos damos soluciones y unos las consideran buenas, otros regulares y otros malas, yo por eso no me enfado, no veo donde está el problema.

Un Saludo.


La franja horaria es GMT +2. Ahora son las 13:15: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