FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Quien Bloquea un registro?
Hola a todos y gracias por anticipdo. He buscado y leido en el foro pero no he encontrado respuesta al problema: ¿Que usuario esta bloqueando un registro en una tabla paradox?.
Hay un ejemplo en el foro paro da errores. He mirado en los trucos de IanMartens pero tampoco he visto nada que me ayude....... Por favor, habría alguien que me indicase como pudo sacar el mensaje: "Registro bloqueado por el usuario XXXXXX"? Muchas gracias por vuestra ayuda Marcial |
#2
|
|||
|
|||
Hola marcial, el encargado de administrar los usuarios en paradox y generar los mensajes es el fichero PDOXUSRS.NET para mas información sobre esto pasate por paradox en red y tendras mas argumentos incluyendo links a articulos de Borland.
Saludos |
#3
|
|||
|
|||
Cita:
Gracias Ruben por tu interës; ya se que es pdoxusrs:net quien bloquea; pero lo que yo quiero conseguir es evitar ese mensaje ta horrible de paradox y sacar uno mio diciendo en español: Registro bloqueado por USUARIO, |
#4
|
||||
|
||||
Prueba con este procedimiento que yo utilizo con las tablas Paradox y me va perfectamente:
Código:
Procedure midberror(DataSet: TDataSet; E: EDatabaseError); ……. Const eKeyViol = 9729; eRequiredFieldMissing = 9732; eForeignKey = 9733; eDetailsExist = 9734; eSqlGralerror = 13059; eInvalidTime = 10058; eInvalidDate = 75; EinvalidDateTime=10060; eRegisterLocked= 10241; implementation …… Procedure midberror(DataSet: TDataSet; E: EDatabaseError); var mierror:double; begin mierror:= (E as EDBEngineError).Errors[0].Errorcode; if (E is EDBEngineError) then if (E as EDBEngineError).Errors[0].Errorcode = eKeyViol then begin Application.MessageBox('Imposible dar alta ese registro ya existe','Atención',mb_Ok + mb_IconQuestion); Abort; end; if (E as EDBEngineError).Errors[0].Errorcode = eRequiredFieldMissing then begin Application.MessageBox('Imposible dar alta hay un campo vacio.','Atención',mb_Ok + mb_IconQuestion); Abort; end; if (E as EDBEngineError).Errors[0].Errorcode = eInvalidTime then begin Application.MessageBox('Formato de hora incorrecto.','Atención',mb_Ok + mb_IconQuestion); Abort; end; if (E as EDBEngineError).Errors[0].Errorcode = eInvalidDate then begin Application.MessageBox('Formato de fecha incorrecto.','Atención',mb_Ok + mb_IconQuestion); Abort; end; if (E as EDBEngineError).Errors[0].Errorcode = eInvalidDateTime then begin Application.MessageBox('Formato de fecha-hora incorrecto.','Atención',mb_Ok + mb_IconQuestion); Abort; end; //campo en blanco if (E as EDBEngineError).Errors[0].Errorcode = eSqlGralerror then begin Application.MessageBox('Imposible dar alta hay un campo requerido vacío.','Atención',mb_Ok + mb_IconQuestion); Abort; end; //Registro bloqueado if (E as EDBEngineError).Errors[0].Errorcode = eRegisterLocked then begin Application.MessageBox('Imposible hacer modificaciones registro bloqueado por otro usuario.','Atención',mb_Ok + mb_IconQuestion); Abort; end; end; //aqui capturamos el error de bloqueo procedure TdmoPalma.CliEditError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin midberror(cli,e); end; procedure TdmoPalma.CliPostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin midberror(cli,e); end;
__________________
Guía de Estilo de los Foros Cita:
|
#5
|
||||
|
||||
Le he añadido una función para que nos devuelva el nombre del ordenador de la red que esta bloqueando el registro, así queda mejor. II
Código:
Procedure midberror(DataSet: TDataSet; E: EDatabaseError); function GetComputerNetName: string ……. Const eKeyViol = 9729; eRequiredFieldMissing = 9732; eForeignKey = 9733; eDetailsExist = 9734; eSqlGralerror = 13059; eInvalidTime = 10058; eInvalidDate = 75; EinvalidDateTime=10060; eRegisterLocked= 10241; implementation …… Procedure midberror(DataSet: TDataSet; E: EDatabaseError); var mierror:double; sComputerNetName:String; sMsgeErrorBloqueo:String; begin mierror:= (E as EDBEngineError).Errors[0].Errorcode; sComputerNetName:=GetComputerNetName(); sMsgeErrorBloqueo:='Imposible hacer modificaciones registro bloqueado por el usuario.'+ sComputerNetName; if (E is EDBEngineError) then if (E as EDBEngineError).Errors[0].Errorcode = eKeyViol then begin Application.MessageBox('Imposible dar alta ese registro ya existe','Atención',mb_Ok + mb_IconQuestion); Abort; end; if (E as EDBEngineError).Errors[0].Errorcode = eRequiredFieldMissing then begin Application.MessageBox('Imposible dar alta hay un campo vacio.','Atención',mb_Ok + mb_IconQuestion); Abort; end; if (E as EDBEngineError).Errors[0].Errorcode = eInvalidTime then begin Application.MessageBox('Formato de hora incorrecto.','Atención',mb_Ok + mb_IconQuestion); Abort; end; if (E as EDBEngineError).Errors[0].Errorcode = eInvalidDate then begin Application.MessageBox('Formato de fecha incorrecto.','Atención',mb_Ok + mb_IconQuestion); Abort; end; if (E as EDBEngineError).Errors[0].Errorcode = eInvalidDateTime then begin Application.MessageBox('Formato de fecha-hora incorrecto.','Atención',mb_Ok + mb_IconQuestion); Abort; end; //campo en blanco if (E as EDBEngineError).Errors[0].Errorcode = eSqlGralerror then begin Application.MessageBox('Imposible dar alta hay un campo requerido vacío.','Atención',mb_Ok + mb_IconQuestion); Abort; end; if (E as EDBEngineError).Errors[0].Errorcode = eRegisterLocked then begin Application.MessageBox(Pchar(sMsgeErrorBloqueo),'Atención',mb_Ok + mb_IconQuestion); Abort; end; end; //aqui capturamos el error de bloqueo procedure TdmoPalma.CliEditError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin midberror(cli,e); end; procedure TdmoPalma.CliPostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction); begin midberror(cli,e); end; function GetComputerNetName: string; var buffer: array[0..255] of char; size: dword; begin size := 256; if GetComputerName(buffer, size) then Result := buffer else Result := '' end; Un Saludo.
__________________
Guía de Estilo de los Foros Cita:
Última edición por marcoszorrilla fecha: 01-10-2003 a las 00:55:46. |
#6
|
|||
|
|||
Cita:
Gracias de nuevo por contestar, pero creo que si pongo "if GetComputerName..." lo que obtengo es el nombre del usuario local y lo que yo quiero saber es qué usuario de la red es el que bloquea, no el nombre de mi usuario. PC1 PC2 Edita primero el registro Quiero que aparezca: Registro bloqueado por PC1 |
#7
|
||||
|
||||
Busca en el hitorico del foro anterior y encontraras un ejemplo completo y tambien encontraras una funcion que haces lo que quieres, los dos ejemplos son mios asi que mira, si no la encuentras mandame un emilio y te envio la transcripción de la función.
Esta lo que hace es cojer el error que canta el programa (donde curiosamente viene el usuario) y los pasa de manera que nosotros queremos. Un saludo desde Canarias. Última edición por José Luis Garcí fecha: 03-10-2003 a las 16:23:55. |
#8
|
|||
|
|||
Cita:
Muchas gracias por contestar mi duda pero tengo que decirte que ya leí tus mensajes de marzo pasado y tampoco pude solucionarlo. Leí todos los trucos de Ian Marteens y no encontré la solución, y probé el programa que escribiste y me da un error que no supe solucionar; el error es el siguiente: usua:=(copy(error(Ansipos('User:',error)+5),(length(error)-(ansipos('User:',error)+4)))); me dice dos cosas: 1) Missing operator or semicolon. 2) Not enough actual parameters y el cursor se pone entre el la A del primer Ansipos y el paréntesis e su izquierda. Tambien he quitado el apöstrofo de text1+usua'+text2 pero tampoco. No he sabido modificarlo para que funcione. ¿Podrías ayudarme? Gracias por anticipado Marcial |
#9
|
||||
|
||||
Yo tambien uso la funcion esa del usuario.... pero da mas problemas que otra cosa, sobre todo, porque la cadena 'User' puede estar contenida en otros errores al editar el registro. Pero vamos, lo que buscas es esto:
Código:
Function USUARIO(Error:string):string; begin Result :=copy(error,(Ansipos('User:',error)+6),length(error)-(ansipos('User:',error)+4)); qrypuesto.ParamByName('prPuesto').AsString:=copy(error,(Ansipos('User:',error)+6),length(error)-(ansipos('User:',error)+4)); qrypuesto.Prepare; qryPuesto.open; try if not (qrypuesto.IsEmpty) then if not qrypuesto.Fields[0].IsNull then Result:= qrypuesto.Fields[0].AsString finally qrypuesto.Close; end; result := uppercase(result); end; Eso si, cuando un usuario se va del sistema tienes que borrar el campo 'puesto' de la tabla login. Advertencia: No uses GetUserName, usuario que inició la sesion en Windows, ya que seria dependiente del sistema operativo que usa el Cliente |
#10
|
||||
|
||||
Ahora con la funcion de MarcosZorrilla ya queda mejor, y si encima se le añade la funcion esa qryPuesto... entonces no digamos
enga, hasta otra. |
#11
|
|||
|
|||
Cita:
Muchisimas gracias a todos por vuestra ayuda.......ahora estoy encantado de boquear y desbloquar los registros sólo por ver ese tan deseado mensaje.........Gracias otra vez a todos Marcial |
#12
|
||||
|
||||
Quisiera saber como enviar mensajes de error en campos obligatorios
Cita:
de antamano gracias.. |
#13
|
||||
|
||||
Debes de llamar al procedimiento indicado en el evento:
OnPostError del Ttable correspondiente.
Un Saludo.
__________________
Guía de Estilo de los Foros Cita:
|
#14
|
||||
|
||||
donde debo poner el codigo que indicas...
lo que me indicaste lo puse dentro del Modulo de Datos
me cree un archivo unit y lo grabe con el nombre de midberror y a su vez puse el llamado dentro del Modulo de Datos. unit Modulo; interface uses SysUtils, Classes, DB, DBTables, midberror; y la verdad no se donde escribir el demas codigo (osea este) porque me marco errores... gracias de antemano.... |
#15
|
||||
|
||||
Tendrás que decirnos que errores son los que te marca, que seguramente vendrán por la falta de alguna Unit. Yo uso ese procedimiento hace mucho tiempo y nunca me ha fallado.
Un Saludo.
__________________
Guía de Estilo de los Foros Cita:
|
#16
|
||||
|
||||
a ver si ahora si me puedo explicar... y mil disculpas
aqui te muestro el codigo completo de mi Modulo.pas (es donde tengo las tablas que operan el sistema) y los errores que me marcan son los siguientes: [Hint] Modulo.pas(67): Value assigned to 'mierror' never used [Error] Modulo.pas(120): Undeclared identifier: 'TbEmpleados' [Error] Modulo.pas(35): Unsatisfied forward or external declaration: 'TDM.TbEmpleadosPostError' [Error] Modulo.pas(37): Unsatisfied forward or external declaration: 'TDM.midberror' [Fatal Error] Cardex.pas(162): Could not compile used unit 'Modulo.pas' ... y en lo que respecta a esta parte del codigo a que te refieres o a donde lo pongo: que significa esta funcion TdmoPalma.CliEditError.... Cli = si no me equivoco es el nombre de la tabla TbEmpleados TdmoPalma = ? CliEditError = ? CliPostError = ? Espero tu ayuda y de antemano muchas gracias por contestar mis mensajes... gracias Última edición por Goyo fecha: 17-05-2007 a las 20:47:44. |
#17
|
||||
|
||||
Aquí tienes un ejemplo completo que funciona correctamente.
Un Saludo.
__________________
Guía de Estilo de los Foros Cita:
|
#18
|
||||
|
||||
ya funciona, y me manda los mensajes requeridos
gracias Marcoszorrilla por la gran ayuda que has brindado...
aqui pongo el codigo que puse dentro de mi Modulo de Datos para cada una de las tablas que tengo en mi aplicacion.. funciona y manda los mensajes gracias y un saludo.... |
|
|
|