Cita:
Empezado por RONPABLO
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.