Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Validar Primary Key Compuesta ?? (https://www.clubdelphi.com/foros/showthread.php?t=3930)

norberto_larios 24-09-2003 23:26:19

Validar Primary Key Compuesta ??
 
Tengo

Una tabla de almacenes
CREATE TABLE ALMACENES (
ID_ALMACEN INTEGER NOT NULL,
ETC….
);

Una tabla de productos
CREATE TABLE MED_MATCUR (
ID_PRODUCTO INTEGER NOT NULL,
ETC….
);

Una tabla de Productos x almacen
CREATE TABLE CATXALM (
ID_ALMACEN INTEGER NOT NULL,
ID_PRODUCTO INTEGER NOT NULL,
STOCK_MIN INTEGER NOT NULL,
STOCK_MAX INTEGER NOT NULL,
EXISTENCIA INTEGER,
REV_CADUCIDAD DATE
);

Donde la llave Prinipal esta formada por ID_ALMACEN,ID_PRODUCTO

ALTER TABLE CATXALM ADD CONSTRAINT PK_CATXALM PRIMARY KEY (ID_ALMACEN, ID_PRODUCTO);

Entonces yo antes de crear un Nuevo registro en la tabla de Productos por almacen quiero verificar si éste ya existe. Por ejemplo quiero dar de alta el producto 5 del almacen 3.

hago lo siguiente con delphi
Var
v_llave: string;
begin
// concateno los id correspondientes convertidos en strings
v_llave:=inttostr(DM01.SD_AlmacenesID_ALMACEN.Value)+inttostr(DM01.SD_Med_MatCurID_PRODUCTO.Value);
ShowMessage(v_llave);
// utilizo el FindKey para verificar, pero esto no me esta funcionando,seguro estoy mal
// ¿???? Como se debe hacer
if not DM01.SD_CatXAlm.FindKey([v_llave]) then
begin
DM01.SD_CatxAlm.Insert;
DM01.SD_CatXAlmID_PRODUCTO.Value := DM01.SD_Med_MatCurID_PRODUCTO.Value;
DM01.SD_CatXAlmSTOCK_MIN.Value := 0;
DM01.SD_CatXAlmSTOCK_MAX.Value := 0;
end;
end;

pudieran ayudarme???

__cadetill 25-09-2003 01:44:06

Código:

Query.SQL.Add('select * from CATXALM');
Query.SQL.Add('where ID_ALMACEN = :alma and');
Query.SQL.Add('    ID_PRODUCTO = :prod');
Query.ParamByName('alma').AsInteger := 3;
Query.ParamByName('prod').AsInteger := 5;
Query.Open;

if Query.Fields[0].IsNull then
  ShowMessage('Articulo inexistente')
else
  ShowMessage('Articulo existente');

Espero te sirva

Cabanyaler 25-09-2003 09:05:06

Buena costumbre también sería que pusieses esta operación entre transacciones.

norberto_larios 25-09-2003 20:12:26

Me parece un buena opcion, aunque me gustaria mas porder utilizar la funcion .FindKey con el parametro correspondiente, sera q no se puede con una llave compuesta???
gracias

__cadetill 25-09-2003 21:06:20

Cita:

Posteado originalmente por norberto_larios
Me parece un buena opcion, aunque me gustaria mas porder utilizar la funcion .FindKey con el parametro correspondiente, sera q no se puede con una llave compuesta???
gracias

Poder, lo que se dice poder, sí que se puede, lo que pasa es que a mi no me gusta y por eso te puse esa solución. Pero si quieres hacerlo con FindKey

Código:

Tabla.FindKey([buscar1, buscar2, bucar3,......,buscarN]);
No obstante, recuerda que la tabla ha de estar indexada por los campos por los que quieras buscar. Si no los tienes ordenados por esos campos (o no existe índice por ellos), puedes utilizar el Locate

Código:

Tabla.Locate('campo1, Campo2,..., campoN', VarArrayOg([campo1, campo2,...,campoN]), []);
Espero te sirva

norberto_larios 25-09-2003 22:01:18

Me gusta mas esa forma
muchas gracias, la voy a probar en este momento


La franja horaria es GMT +2. Ahora son las 11:06:05.

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