FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
actualizar tabla al calcular un campo autocalculado
Hola a todos
estoy trabajando con Delphi 7 y sqlserver 2000 y en mi aplicacion en la tabla de fichajes transformo una cadena como esta 08:00 a un valor numerico, y pretendo asignarselo a un campo de la bd de tipo entero, pero siempre me sale el mismo error: "stack over flow" y no se como hacer que me modifique la bd con el dato que quiero introducir, alguien podria ayudarme. Gracias. |
#2
|
||||
|
||||
Hola.
¿ Como transformas a valor numérico ?. Porqué yo no veo claro que valor numérico corresponde a la cadena '08:00' Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#3
|
|||
|
|||
he hecho una funcion que transforma de una cadena los numero en valores numericos y desecha los caracteres.
Cita:
|
#4
|
||||
|
||||
El mensaje de error te indica que tienes un desbordamiento de pila. ¿ Esta función es recursiva ?.
Vas a tener que poner algo de código, de la función que falla, y de como intentas actualizar el campo. Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#5
|
|||
|
|||
Hola GuillotMarc
este es el codigo del procedimiento CalcFields var manyana,tarde:boolean; M1,M2,T1,T2:String; op,hor,min:integer; h1,h2:string; ht : array [0..2] of char; mt : array [0..5] of char; x:STRING; m,t:Tdatetime; horas:string; i:byte; hh,mm:string; hint,mint:integer; begin op:= strtoint(FCronos.TipoAccion.text); case op of 1 : {Actualizo los campos autocalculados'} begin manyana:=false; tarde:=false; if Tfichajes.FieldByName('HoraEntM').AsString >'00:00:00' then begin M1:=TFichajes.FieldbyName('HoraEntM').AsString; end else begin manyana:=true; { M1:='07:07:00';} end; if (TFichajes.FieldByName('HoraSalM').AsString) > '00:00:00' then begin M2:=Tfichajes.FieldByName('HoraSalM').Asstring; end else begin manyana:=true; { M2:='13:33:00'} end; if TFichajes.FieldByName('HoraEntT').AsString > '00:00:00' then begin T1:=Tfichajes.fieldbyname('HoraEntT').AsString; end else begin Tarde:=true; end; if TFichajes.FieldByName('HoraSalT').AsString > '00:00:00' then begin T2:=Tfichajes.fieldbyname('HoraSalT').AsString; end else begin Tarde:=true; end; if not manyana then h1:=timetostr(strtotime(M1)-strtotime(M2)) else begin h1:='00:00:00'; manyana:=true; end; if not tarde then h2:=timetostr(strtotime(T1)-strtotime(T2)) else begin h2:='00:00:00'; tarde:=true; end; x:=timetostr((strtotime(h1)+strtotime(h2))); if (not tarde) and (not manyana) then begin FFichaEmp.GEFichaje.Font.color := clnavy; TFichajes.FieldByName('HTXT').AsString:=x; mm:='';hh:=''; TFichajes.fieldbyname('Mayana').asstring:=h1; TFichajes.fieldbyname('Tarde').asstring:=h2; horas:=x; for i:=1 to length(horas) do begin if Horas[i] <> ':' then if i<3 then hh:=hh+Horas[i] else if i>3 then if i<6 then mm:=mm+Horas[i]; end; hint:=strtoint(hh); mint:=strtoint(mm); TFichajes.Edit; { AL AÑADIR ESTA LINEA ME DA DESBORDAMIENTO} TFichajes.FieldByName('Horas').AsInteger:= hint; TFichajes.FieldByName('Minutos').AsInteger:=mint; end else begin FFichaEmp.GEFichaje.Font.Color :=clred; TFichajes.FieldByName('HTXT').AsString:=x; mm:='';hh:=''; horas:=x; for i:=1 to length(horas) do begin if Horas[i] <> ':' then if i<3 then hh:=hh+Horas[i] else if i>3 then if i<6 then mm:=mm+Horas[i]; end; hint:=strtoint(hh); mint:=strtoint(mm); TFichajes.Edit; TFichajes.FieldByName('Horas').AsInteger:= hint; TFichajes.FieldByName('Minutos').AsInteger:=mint; end; Como ves el codigo es muy rudimentario, lo siento pero soy novato...jeje gracias por tu ayuda. Adios. Cita:
|
#6
|
|||
|
|||
Hola, Telemaco, sería de agradecer que encerraras todo ese código entre etiquetas [ code ] y [ /code ], aparecería el código identado y más gente se animaría a investigarlo en busca de la solución ...
Un Saludo
__________________
Guía de Estilo |
#7
|
||||
|
||||
Dado que no está indentado, se me hace realmente dificil leer el código, y no lo he hecho (seguí la recomendación de Andres al respecto). Sin embargo me parece que, dado que se trata de un evento OnCalcFields, seguramente estas haciendo una asignación a un campo no calculado dentro del evento, con lo que éste se dispara nuevamente... provocando una recursividad indirecta, e infinita (ya que no hay condición que pare esta recursividad).
Esto lo podes comprobar fácilmente poniendo un breakpoint al inicio del método, siguiendolo paso a paso, y viendo como, al hacer alguna asignación (o probablemente la llamada a otra rutina que hace una asignación) el evento se dispara nuevamente (pasando por el breakpoint). Yo elimino normalmente este efecto teniendo un flag en el formulario o módulo de datos, digamos FCalculando... que inicializas a false, y luego hago algo como esto en el evento: Código:
Procedure Form1Table1CalcFields(parametros); Begin if not FCalculando Then Begin FCalculando := True; // se enciende el flag, para evitar la recursividad indirecta. try CodigoNormalDelEvento; finally FCalculando := False; // esto siempre se ejecuta, aunque el evento se aborte // por una condición de error. End; End; // de esta forma, no se ejecuta ni una sola línea si ya se ha entrado al evento // una vez End;
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
|
|
|