Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

 
 
Herramientas Buscar en Tema Desplegado
  #18  
Antiguo 18-07-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 20
donald shimoda Va por buen camino
Cita:
Empezado por RONPABLO Ver Mensaje
Donald, lo de los UIDs suena interesante, si no te molesta nos podrias decir con que crea los UIDs?? y en donde los crea... desde la aplicación o desde la base de datos?...
Claro amigo, con mucho gusto.

Si utilizas un UDF, que es basicamente una dll generado por delphi y que colocas en la carpeta de udfs de tu servidor delphi, entonces puedes crear luego un procedure en tu base que antes de insertar LLAME al codigo de la udf, genere el UID y lo asigne a tu clave primaria.

Si lo haces en tu delphi (lo cual te la libertad de moverlo entre motores de base de datos el dia de mañana) simplemente le asignas el valor al campo, llamando a la función de la librería que a continuación te copio.

Código Delphi [-]
unit uGUID;
interface

type

  PUUIDc = ^TUUIDc;

  TUUIDc = array[0..21] of AnsiChar;



  PGUIDc = ^TGUIDc;

  TGUIDc = array[0..35] of AnsiChar;



function UUIDCreate(uuid: PUUIDc): PUUIDc; stdcall;

function GUIDcreate(guid: PGUIDc): PGUIDc; stdcall;

function GUIDtoUUID(guid: PGUIDc; uuid: PUUIDc): PUUIDc; stdcall; overload;

function GUIDtoUUID(aGUID: TGUID): string; overload;



function GenGUID(Full: Boolean = False; upperCase: Boolean = False): string;

function GenUUID: string;



implementation



uses SysUtils;



function GenGUID(Full, upperCase: Boolean): string;



var

  aGUID: TGUID;



begin

  CreateGuid(aGUID);

  Result:= GuidToString(aGUID);

  if not Full then

    Result:= System.Copy(Result, 2, 36);

  if upperCase then

    Result:= AnsiUpperCase(Result);

end;



const

  URLchars: array[0..63] of AnsiChar = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-';



function GUIDcreate(guid: PGUIDc): PGUIDc;



var

  s: string;



begin

  s:= GenGUID(False);

  Move(s[1], guid^, SizeOf(guid^));

  Result:= guid;

end;



function GUIDtoUUID(guid: PGUIDc; uuid: PUUIDc): PUUIDc;



var

  x, i: Integer;

  s: string;

  aGUID: TGUID;

  aGuidArray: array[0..1] of Int64 absolute aGUID;



begin

  SetLength(s, SizeOf(guid^));

  Move(guid^, s[1], SizeOf(guid^));

  aGUID:= StringToGuid(s);

  for x:= Low(uuid^) to High(uuid^) do

  begin

    i:= x div 11;

    uuid[x]:= URLchars[aGuidArray[i] and $0000003F];

    aGuidArray[i]:= aGuidArray[i] shr 6;

  end;

  Result:= uuid;

end;



function UUIDCreate(uuid: PUUIDc): PUUIDc;



var

  x, i: Integer;

  aGUID: TGUID;

  aGuidArray: array[0..1] of Int64 absolute aGUID;



begin

  CreateGuid(aGUID);

  for x:= Low(uuid^) to High(uuid^) do

  begin

    i:= x div 11;

    uuid[x]:= URLchars[aGuidArray[i] and $0000003F];

    aGuidArray[i]:= aGuidArray[i] shr 6;

  end;

  Result:= uuid;

end;



function GUIDtoUUID(aGUID: TGUID): string;



var

  x, i: Integer;

  aGuidArray: array[0..1] of Int64 absolute aGUID;



begin

  SetLength(Result, 22);

  for x:= 1 to 22 do

  begin

    i:= Pred(x) div 11;

    Result[x]:= URLchars[aGuidArray[i] and $0000003F];

    aGuidArray[i]:= aGuidArray[i] shr 6;

  end;

end;



function GenUUID: string;



var

  uuid: TUUIDc;

begin

  UUIDCreate(@uuid);

  SetLength(Result, SizeOf(uuid));

  Move(uuid, Result[1], SizeOf(uuid));

end;



end.

La definición del campo FIREBIRD sería.
Código SQL [-]
CREATE DOMAIN GUID AS CHAR(22) CHARACTER SET ISO8859_1 COLATE ES_ES


Es muy importante lo del charset porque generara unos chars muy raros.

P.D. Perdón por la calidad del identado, el formateador de código del foro lo destrozo, ni idea por que.

Espero que te sirva. Saludos.
Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal

Última edición por donald shimoda fecha: 18-07-2008 a las 16:22:47.
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
insertar registro en un grid que esta en otro grid @-Soft SQL 7 20-02-2008 17:22:42
Campos calculados y el GRID agova OOP 1 14-02-2008 19:53:04
la computacion grid en accion - world community grid nightynvid La Taberna 0 04-01-2007 17:33:44
campos de un grid despues de un query davidgaldo Conexión con bases de datos 1 13-11-2003 14:46:49
Visualización de campos MEMO en un Grid Cabanyaler Conexión con bases de datos 2 26-08-2003 13:53:10


La franja horaria es GMT +2. Ahora son las 21:18:20.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi