Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   error, el índice o la clave principal no puede tener un valor null (https://www.clubdelphi.com/foros/showthread.php?t=38418)

locorez 14-12-2006 01:48:07

error, el índice o la clave principal no puede tener un valor null
 
Hola,
tengo un pequeño problema con el programa y es el siguiente.
Tengo una query conectada a un grid:
Código SQL [-]
SELECT Stock.ID, Revistes.Revista, Revistes.Preu, Stock.Num, Stock.DataA, Stock.Quantitat, Revistes.Distribuidora
FROM Revistes INNER JOIN Stock ON Revistes.Codi_Barres = Stock.ID;
luego tengo este evento:
Código Delphi [-]
procedure TStock.adotblRevistesIDChange(Sender: TField);
begin
  adotblrevistesID.OnChange := nil;
  adoqry9.Close;
  adoqry9.SQL.Text := 'Select * from revistes where Codi_Barres = :codi';
  adoqry9.Parameters.ParamByName('codi').Value := adotblRevistes.FieldByName('ID').AsString;
  adoqry9.Open;
  adotblRevistes.FieldByName('Revista').AsString := adoqry9Revista.asstring;
  adotblRevistes.FieldByName('Preu').AsCurrency := adoqry9Preu.ascurrency;
  adotblRevistes.FieldByName('Distribuidora').AsString := adoqry9Distribuidora.asstring;
  adotblRevistes.FieldByName('DataA').Value := now;
  adotblRevistes.FieldByName('Num').AsString := Codicorrecte(adotblRevistes.fieldbyname('ID').asstring);
  //adoqry9.Close;
  if length(adotblRevistes.FieldByName('Num').AsString) > 13 then
    adotblRevistes.FieldByName('ID').AsString := copy(adotblRevistes.FieldByName('Num').AsString,0,13);
  adotblrevistesID.OnChange :=  adotblRevistesIDChange;
end;
Ahora explico de que va todo esto XD
El usuario tiene un dbgrid donde solo estan en readonly false el ID y la cantidad. El ID es el código de la revista. Bien, una vez el usuario introduce el codigo de barras de la revista, salta el evento que antes he escrito y hago una consulta, esta:
Código SQL [-]
select * from Revistes where codi_Barres = :codi
Le paso el parametro ID y una vez he identificado la revista con la consulta, relleno los campos con la información. Una vez hecho esto el usuario solo debe de poner la cantidad y ya está. Pero no, a la hora de grabar los datos en la query me pone: "error, el índice o la clave principal no puede tener un valor null". Pero si cierro y vuelvo abrir, el registro, es decir, la revista nueva, ya estará en la tabla stock. No se porque ocurre y todo que funciona queda feo. Alguien me puede ayudar?
Saludos y gracias.

Se me olvidaba, todo y que en el codigo tengo puesto adotblRevistes es una query.

Paoti 14-12-2006 02:58:04

creao que estas haciendo una mala logica para insertar un detalle de una revistas...



corrijeme si me equivoco, estas programando que si detecta un cambio en el campo ID de la tabla revistas, se ejecute ese codigo.?


eso esta muy mal no le veo sentido. otra pregunta, segun el codigo anterior, cuando insertaas un nuevo registro?


creo que lo que quieres hacer tu es:

tienes tu tabla Revistas: Select * from Revistas

y quieres ir agregando en un dbgrid las revistas que se estan llevando y cuentas revistas son.


yo dejaria Revistas como estas.


y crearia una tabla llamada detalleRevistas.


pondria un dbgrid.

lo asocio a detallerevistas.

pongo una caja de texto y en la evento keypress de la caja al poner el codigo de la revista

Código Delphi [-]
adoqry9.Close;
  adoqry9.SQL.Text := 'Select * from revistes where Codi_Barres = :codi';
  adoqry9.Parameters.ParamByName('codi').Value := adotblRevistes.FieldByName('ID').AsString;
  adoqry9.Open;

-- aqui hago un adoDetalle.insert;
adotblRevistes --> doDetalle CAMBIANDO ESTO POR DETALLEREVISTA
adotblRevistes.FieldByName('Revista').AsString := adoqry9Revista.asstring;
  adotblRevistes.FieldByName('Preu').AsCurrency := adoqry9Preu.ascurrency;
  adotblRevistes.FieldByName('Distribuidora').AsString := adoqry9Distribuidora.asstring;
  adotblRevistes.FieldByName('DataA').Value := now;
adodetallerevista.post



no se no se lo que pretendes

locorez 15-12-2006 01:10:31

ahora me explico un poco mejor.
Tengo la tabla revistas con su codigo (clave principal), nombre, precio y distribuidor.
Luego tengo la otra tabla, stock. En esta tabla guardo el codigo de la revista, el nº, cantidad y fecha de llegada.
Tengo el adoquery anteriormente mencionado
Código SQL [-]
SELECT Stock.ID, Revistes.Revista, Revistes.Preu, Stock.Num, Stock.DataA, Stock.Quantitat, Revistes.Distribuidora
FROM Revistes INNER JOIN Stock ON Revistes.Codi_Barres = Stock.ID;

Este adoquery esta conectado a un dbgrid. Lo que quiero es, cuando el usuario me introduzca el codigo de la revista en el grid se me ponga toda la información de la revista en el resto de las casillas del grid (nombre, precio, distribuidor; el numero lo se a partir del codigo de barras). Esto lo tengo en el evento onchange del campoID. Todo me funciona y me lo hace. Pero el problema está en que no se porqué, a la hora de cambiar de registro o de hacer un refresh o lo que sea me sale este error de que el indice tiene valor null. Pero si miro en la tabla stock, la revista que he introducido sale con todos los campos llenos.

Paoti 15-12-2006 04:40:42

y porque no todo lo poenes en una msima tabla y solo modificas el campo cantidad.




si lo quieres ahcer asi como tu quieres.




no hagas el select con la union,



y en la tabla de socks, creas camps calculados que se calculan automaticamente a partir del valor de tu clave primaria (ID) cuando se encuentre en el catalogo de Revistas(codigo de barras)


y como se hace un campo calculado, busca en el foro o en google, son faciles. click sobre el query o table, opcin datafields editor, en la ventanita que te aparece click boton derecho, add all fields, enseguida otro click boton derecho, add field, y es de tipo calcultaed,


para hacer eso debes de tener otro query que apunte a la tabla revistas, y de ahi va a traer los campos que cumplan con la condicion de busqueda.


busca en google

http://www.google.com.mx/search?hl=e...s+delphi&meta=


La franja horaria es GMT +2. Ahora son las 11:35:41.

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