Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-07-2007
Arturo_ Arturo_ is offline
Miembro
 
Registrado: jul 2007
Posts: 48
Poder: 0
Arturo_ Va por buen camino
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

*)

Última edición por marcoszorrilla fecha: 13-07-2007 a las 21:58:12.
Responder Con Cita
  #2  
Antiguo 13-07-2007
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Lo que haces quedaría más simple utilizando SQL, con un simple:

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


Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 13-07-2007
Arturo_ Arturo_ is offline
Miembro
 
Registrado: jul 2007
Posts: 48
Poder: 0
Arturo_ Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 13-07-2007
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #5  
Antiguo 14-07-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
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.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/

Última edición por jhonny fecha: 14-07-2007 a las 02:25:41.
Responder Con Cita
  #6  
Antiguo 14-07-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡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.
Responder Con Cita
  #7  
Antiguo 23-07-2007
Arturo_ Arturo_ is offline
Miembro
 
Registrado: jul 2007
Posts: 48
Poder: 0
Arturo_ Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 23-07-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
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
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #9  
Antiguo 23-07-2007
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Abrir tabla en nuevo registro Moparova Conexión con bases de datos 4 17-05-2007 21:24:03
Registro Nuevo, Porque se va al Final???? AGAG4 Conexión con bases de datos 9 10-08-2005 07:44:11
Insertar Nuevo Registro perillan Conexión con bases de datos 3 24-04-2005 14:30:23
nuevo registro en tabla de sqlserver davidgaldo Conexión con bases de datos 4 24-09-2004 14:37:38
Error al insertar nuevo registro Humberto Firebird e Interbase 13 06-05-2004 22:45:01


La franja horaria es GMT +2. Ahora son las 09:30:40.


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
Copyright 1996-2007 Club Delphi