[RESUELTO] ABM en Delphi 7 usando MySQL
#1
Escrito 27 agosto 2010 - 09:35
Les quiero hacer una consulta. Resulta que estoy trabajando con una sencilla base de datos en MySQL, por ahora estoy haciendo altas bajas y modificaciones. El tema de Altas, ya lo tengo completo, pero a la hora de hacer las Modificaciones, me surgio un problemita, quizas sea solo de lógica, les paso a comentar.
En el caso de las altas, en una tabla llamada clientes, verifico que el numero de DNI que se ingresa no exista en algun otro registro. Si existe, avisa al usuario para que modifique ese valor y recien permitir el ingreso de ese nuevo registro.
Pero en la parte de modificaciones, permito que la busqueda se realice por numero de DNI. Si existe un registro asociado a ese numero, me trae los campos de la tabla con sus respectivos valores para modificarlos y los muestro a cada uno en un TEdit.
El tema es que cuando el usuario modifica el nombre, apellido o telefono por ejemplo. Me muestra una advertencia como la que puse en la insercion. Se busca el numero de DNI y si existe avisa que ya hay un registro con ese numero y que ingrese otro.
Esa busqueda o revision que hago tambien en la modificacion, la hago porque el usuario puede tambien modificar su numero de DNI y este no tiene que ser uno de los ya existentes.
Claramente esto no pasa si cambio el numero de DNI por otro distinto y despues los demas campos que quiera.
Espero que me hayan entendido, se me hizo un poco dificil de explicar.
Saludos y gracias por su tiempo!
#2
Escrito 27 agosto 2010 - 09:52
Segundo. En la MODIFICACION no veo necesidad de verificar si existe el DNI ya que el cursor está en ese registro.
Me parece que tienes un problema de concepto.
Salud OS
#3
Escrito 27 agosto 2010 - 10:34
En la tabla clientes, la clave primaria es id_cliente.
Haga la verificacion, porque vi que es necesario en el caso de que se haya tipeado mal y se lo quiera corregir pero que no coincida con otro que ya esta en la tabla. El problema es que cuando se modifica alguno de los demas campos, antes de guardar se vuelve a verificar y el numero si existe porque es el que tiene el registro que actualmente se esta modificando, es por eso que sale la advertencia. Lo que debo hacer, creo si no me equivoco es verificar si existe el DNI en alguno de los registros restantes, sin tener el cuenta el que actualmente estoy modificando.
Quizas sea un problema de concepto como mencionas. Agradezco tu tiempo!
#4
Escrito 27 agosto 2010 - 10:46
#5
Escrito 27 agosto 2010 - 10:59
if ((EClienteDNI.text='') or (EClienteNombre.text='') or (EClienteApellido.text='') or (EClienteTelefono.text='')) then begin messagedlg('Debe completar todos los campos', mtinformation, [mbok],0); end else begin if (TClientes.Locate('dni', strtoint(EClienteDNI.Text),[])) then begin messagedlg('El número de DNI ingresado ya existe', mtinformation, [mbok], 0); EClienteDNI.SetFocus; end else begin TClientes.Insert; TClientes.FieldByName('dni').asinteger:=strtoint(EClienteDNI.Text); TClientes.FieldByName('nombre').AsString:=EClienteNombre.Text; TClientes.FieldByName('apellido').asstring:=EClienteApellido.Text; TClientes.FieldByName('telefono').AsInteger:=strtoint(EClienteTelefono.Text); TClientes.Post; EClienteDNI.Clear; EClienteNombre.Clear; EClienteApellido.Clear; EClienteTelefono.Clear; if (messagedlg('El registro se ingreso correctamente'+chr(13)+'¿Desea ingresar uno nuevo?', mtconfirmation, [mbyes, mbno], 0)=mryes) then begin EClienteDNI.SetFocus; end else begin BClienteCancelar.Click; end; end; end;
Y este el que uso para la modificacion
if ((EClienteDNI.text='') or (EClienteNombre.text='') or (EClienteApellido.text='') or (EClienteTelefono.text='')) then begin messagedlg('Debe completar todos los campos', mtinformation, [mbok],0); end else begin if (TClientes.Locate('dni', strtoint(EClienteDNI.Text),[])) then begin messagedlg('El número de DNI ingresado ya existe', mtinformation, [mbok], 0); EClienteDNI.SetFocus; end else begin TClientes.Edit; TClientes.FieldByName('dni').asinteger:=strtoint(EClienteDNI.Text); TClientes.FieldByName('nombre').AsString:=EClienteNombre.Text; TClientes.FieldByName('apellido').asstring:=EClienteApellido.Text; TClientes.FieldByName('telefono').AsInteger:=strtoint(EClienteTelefono.Text); TClientes.Post; EClienteDNI.Clear; EClienteNombre.Clear; EClienteApellido.Clear; EClienteTelefono.Clear; if (messagedlg('El registro se modifico correctamente'+chr(13)+'¿Desea buscar otro registro?', mtconfirmation, [mbyes, mbno], 0)=mryes) then begin EClienteDNI.SetFocus; end else begin BClienteCancelar.Click; end; end; end;
Es bastante similar al de insertar, ya que lo que no quiero es que se inserte un nuevo DNI (en el caso de que se modifique) que ya exista en la tabla. Pero por hacerlo asi, en el caso de que no modifique DNI, me dice que ya existe uno, por la misma "restriccion" que le pongo encuentra el DNI del registro que estoy modificando.
Probe agregando el codigo que verifica el DNI existente despues de poner la tabla en modo de Edicion pero es igual.
Si tienen algun ejemplo de un ABM o solo de modificacion para ver, se lo agradeceria.
Saludos!
#6
Escrito 27 agosto 2010 - 11:16
if (TClientes.Locate('dni', strtoint(EClienteDNI.Text),[])) then begin messagedlg('El número de DNI ingresado ya existe', mtinformation, [mbok], 0); EClienteDNI.SetFocus; end
Saludos.
#7
Escrito 27 agosto 2010 - 11:20
#8
Escrito 27 agosto 2010 - 11:49
Lo más sencillo es crear un índice único (si lo permite el motor) por el campo DNI y así se encarga la propia base de datos de controlar el echo de que no exista el mismo. Y desde Delphi simplemente controlar en un try..except..end el Post del registro o algo por el estilo.
Todo lo demás (todo el código que se ha puesto) creo que está de más
Nos leemos
#9
Escrito 27 agosto 2010 - 12:12
enecumene, si elimino esa parte del codigo, de que manera puedo lograr que no se ingrese un DNI de los ya existentes en la tabla? sin tener en cuenta en el que estoy modificando
Amigo GUN10, se supone que estas modificando un registro y no insertando otro, en el código de modificación está ese pedazo que te aaseguro está de más. .
#10
Escrito 27 agosto 2010 - 06:02
Buenas
Lo más sencillo es crear un índice único (si lo permite el motor) por el campo DNI y así se encarga la propia base de datos de controlar el echo de que no exista el mismo. Y desde Delphi simplemente controlar en un try..except..end el Post del registro o algo por el estilo.
Todo lo demás (todo el código que se ha puesto) creo que está de más
Nos leemos
Completamente de acuerdo con Cadetill.
#11
Escrito 30 agosto 2010 - 10:48
Saludos!