Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-04-2004
Telemaco Telemaco is offline
Miembro
 
Registrado: feb 2004
Posts: 50
Poder: 21
Telemaco Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 07-04-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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).
Responder Con Cita
  #3  
Antiguo 07-04-2004
Telemaco Telemaco is offline
Miembro
 
Registrado: feb 2004
Posts: 50
Poder: 21
Telemaco Va por buen camino
he hecho una funcion que transforma de una cadena los numero en valores numericos y desecha los caracteres.

Cita:
Empezado por guillotmarc
Hola.

¿ Como transformas a valor numérico ?. Porqué yo no veo claro que valor numérico corresponde a la cadena '08:00'

Saludos.
Responder Con Cita
  #4  
Antiguo 07-04-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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).
Responder Con Cita
  #5  
Antiguo 07-04-2004
Telemaco Telemaco is offline
Miembro
 
Registrado: feb 2004
Posts: 50
Poder: 21
Telemaco Va por buen camino
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:
Empezado por guillotmarc
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.
Responder Con Cita
  #6  
Antiguo 07-04-2004
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 07-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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;
Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 08:46:30.


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
Copyright 1996-2007 Club Delphi