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 Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-05-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
no guarda los datos en la tabla

Hola,

Tengo una aplicación, hecha en delphi 6 con una BD en IB7.

Una de las ventanas de mi aplicación está compuesta por un DBGrid, y tres botones, que son, nuevo, editar y borrar.

Editar y nuevo, me abren una ventana, con los mismos campos que aparecen en el dbgrid.

Los botones Nuevo y borrar me funcionan perfectamente. El problema viene cuando intento editar.

Esto es,Inserto un nuevo registro(Botón "Nuevo"), dejando el campo de fecha vacío (tipo date, sql3),y luego edito ese campo, (Botón "Editar"), e introduzco una fecha válida, que veo como aparece en los campos correspondientes de mi DBGrid, y al pulsar aceptar, (guardar) RESULTA QUE NO ME GUARDA LAS FECHAS.

Sin embargo, cuando lo que no relleno con datos, es un campo Varchar, al editarlo para añadirle ese dato, me lo guarda sin problemas.

Vamos, que el código de post etc, que tiene asociado el botón editar, parece que tiene que estar bien, pues de otro modo, no me guardaría tampoco el dato que introduzco en el campo varchar.

Lo más curioso del tema es que, si al insertar el registro inserto datos en el campo fecha, y luego quiero editar ese campo fecha, ENTONCES SI ME LO GUARDA!!!!!

El código para el botón editar es:

Código Delphi [-]
     
     screen.cursor := crHourGlass;
     FrmVtos := TFrmVtos.Create(Self);
     Screen.cursor := crDefault;
     TRY


        FrmDModule.TbVtosVna.Insert;
        FrmVtos.ShowModal;

        
        If FrmVtos.modalresult = mrOk Then Begin
          //NOS ASEGURAMOS QUE LA FECHA INICIAL ES INFERIOR A LA FINAL
          if FrmDModule.TbVtosVnaFECHAINI.value < FrmDModule.TbVtosVnaFECHAFIN.value Then Begin
             FrmDModule.TbVtosVna.Post;
             FrmDModule.TbVtosVna.Close;
             FrmDModule.TbVtosVna.Open;

          end
          else begin
             Application.MessageBox( 'La Fecha Inicial debe ser menor que la Final',
                                'Atencion', mb_ICONEXCLAMATION);
             FrmDModule.TbVtosVna.Cancel;
          end;


        End  //FIN DE if salimos con OK del modal
        Else Begin
          FrmDModule.TbVtosVna.Cancel;
        End;
     FINALLY
        FrmVtos.Free;
     END;

¿tal vez sea algo relacionado las propiedades que tengo para ese campo en esa tabla? Aparentemente está todo bien. ¿Alguna Idea?

Os agradeceré cualquier orientación que me podais dar, por que estoy algo desesperada con este tema.

Muchas gracias a todos, por todo,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)

Última edición por Giniromero fecha: 26-05-2004 a las 17:51:10.
Responder Con Cita
  #2  
Antiguo 26-05-2004
sanxpue sanxpue is offline
Miembro
 
Registrado: jul 2003
Posts: 196
Poder: 21
sanxpue Va por buen camino
Talking Oye

Oye Gini

Que componente estas usando para meter, borrar y editar

si estas usando un TIBDataSet entonces fijate si en su propiedad de EditSQL tienes el campo Fecha declarado si no pues ponlo...
__________________
saludos desde Puebla Mexico..
asanxt@hotmail.com
"como siempre a sus ordenes y siempre con buena cara"
'lolita me excitas, perversa piel de melocotón'
Responder Con Cita
  #3  
Antiguo 27-05-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola,

lo que tengo en Edit SQL es:

Código SQL [-]
select CODVTO, DESCRIPCION, NUMGRUP, FECHAINI, FECHAFIN
from VTOS
where (NUMGRUP=:NUMGRUP)
and (CURRENT_DATE between FECHAINI and FECHAFIN)
order by fechaini desc


en Insert SQL tengo:
Código SQL [-]
insert into VTOS
  (CODVTO, DESCRIPCION, NUMGRUP, FECHAINI, FECHAFIN)
values
  (:CODVTO, ESCRIPCION, :NUMGRUP, :FECHAINI, :FECHAFIN)

y en modfySQL tengo:


Código SQL [-]
update VTOS
set
  CODVTO = :CODVTO,
  DESCRIPCION = ESCRIPCION,
  NUMGRUP = :NUMGRUP,
  FECHAINI = :FECHAINI,
  FECHAFIN = :FECHAFIN
where
  CODVTO = :OLD_CODVTO and
  NUMGRUP = :OLD_NUMGRUP and
  FECHAINI = :OLD_FECHAINI




Si veis algo, os agradeceré me lo comenteis.

Muchas gracias a todos, por todo

virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #4  
Antiguo 27-05-2004
sanxpue sanxpue is offline
Miembro
 
Registrado: jul 2003
Posts: 196
Poder: 21
sanxpue Va por buen camino
Talking ¿Será que aqui esta el error?

Si lo que tu quieres es modificar el dato debes de usar Edit

Estas escribiendo :

Código Delphi [-]
TRY
   FrmDModule.TbVtosVna.Insert;
   FrmVtos.ShowModal;

y debe de ser

Código Delphi [-]
TRY
   FrmDModule.TbVtosVna.Edit;
   FrmVtos.ShowModal;
__________________
saludos desde Puebla Mexico..
asanxt@hotmail.com
"como siempre a sus ordenes y siempre con buena cara"
'lolita me excitas, perversa piel de melocotón'
Responder Con Cita
  #5  
Antiguo 28-05-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola,


Si, bueno, disculpa mi torpeza, ese es el código que tengo para el botón NUEVO, (insert), no para el botón EDITAR, (Edit), que es el que pongo a continuación:

Código Delphi [-]
     iF FrmDModule.TbVtosVna.RecordCount < 1 tHEN beGIN
      //si no hay registros salimos, pues no hay nada que editar
        showmessage('No hay registros para editar');
        Exit;
     eND
     eLSE bEGIN //Si hay registros,
       screen.cursor := crHourGlass;
       FrmVtos := TFrmVtos.Create(Self);
       Screen.cursor := crDefault;
       TRY
         FrmDModule.TbVtosVna.Edit;
         
         FrmVtos.ShowModal;
         if FrmVtos.modalresult = mrOk then begin
           FrmDModule.TbVtosVna.Post;
           FrmDModule.TbVtosVna.Close;
           FrmDModule.TbVtosVna.Open;
         end
         else begin
           FrmDModule.TbVtosVna.Cancel;
         end;

       FINALLY
         FrmVtos.Free;
       END;
     eND;


De todos modos, ten en cuenta, por si sirve de ayuda, que cuando edito un campo de texto, que nunca ha tenido datos, me los guarda sin problemas, lo que no me deja es guardar los cambios tras editar un campo de tipo date. Y que si edito un registro que ya tiene fechas, y las cambio, eso también me lo hace bien.

Por eso no me parece tanto un problema con .edit o .insert, sino, tal vez, con el propio campo de fechas o algo relaccionado con el.


Muchas gracias por la ayuda.
__________________
Sonrie al mundo, y el mundo te sonreirá :)

Última edición por Giniromero fecha: 28-05-2004 a las 12:30:40.
Responder Con Cita
  #6  
Antiguo 31-05-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola a todos,

Siento que tal vez he sido un poco densa explicandome. Intentaré aclararme un poco:

Esta ventana se encarga de insertar, editar y borrar datos
en una tabla.

Los problemas los tengo al editar y modificar campos
de tipo date.


Comparto la misma ventana para la inserción y la edición
de los datos, (ventana insertar/editar).
Dicha ventana tiene unicamente tres campos:
descripción, de tipo varchar,
fecha Inicial de tipo date,
fecha final de tipo date.

y dos botones: Aceptar, (devuelve modal result OK) y
Cancelar, (devuelve modal result Cancel).


Voy haciendo pruebas con los datos:

1)Inserto un nuevo registro --> Se me muestra la
ventana insertar/editar. Inserto datos sólo en los
campos date, dejando vacio el de descripcion.
acepto, y se guardan los datos.

Una vez hecho esto, edito ese mismos registro.
Me muestra la ventana insertar/editar.
Añado datos en el campo que antes dejé vacío,(nul),
esto es, descripcion. Doy a aceptar y me lo guarda.


2)Esta vez me situo en un registro antiguo, de los que
nunca han tenido datos en fechaini y fechafin
,
siempre han estado vacios o nulos
Edito dicho registro, me muestra la ventana de
insercion/edicion, pidiendome datos para los tres campos.

Añado datos en los campos que antes eran nul,
esto es, fecha inicial y fecha final, doy a aceptar y
NO ME LOS GUARDA.

==> Conclusión, no me deja modificar un campo que era
null si éste es de tipo date


3)Inserto un nuevo registro --> Se me muestra la
ventana insertar/editar.
Inserto datos esta vez sólo en el campo descrición,
dejando vacios los de fecha, y acepto.


Una vez hecho esto, edito ese mismos registro.
Me muestra la ventana insertar/editar.
Añado datos en los campos que antes dejé vacío. esto es,
fecha inicial y fecha final, doy a aceptar y NO ME LOS
GUARDA.

4) Edito un registro que tiene datos en los campo fecha
, me muestra la ventana insertar/editar, modifico las
fechas, doy a aceptar, y me guarda las modificaciones
.

==> Conclusión sólo me da problemas para modificar
campos date que inicialmente estaban vacíos o es null.


Este es el código SQL que tengo para ModifySQL del
IBDataSet:

Código SQL [-]
update VTOS
set
  CODVTO = :CODVTO,
  DESCRIPCION = ESCRIPCION,
  NUMGRUP = :NUMGRUP,
  FECHAINI = :FECHAINI,
  FECHAFIN = :FECHAFIN
where
  CODVTO = :OLD_CODVTO and
  NUMGRUP = :OLD_NUMGRUP and
  FECHAINI = :OLD_FECHAINI

este el que tengo en el SelectSQL

Código SQL [-]
select CODVTO, DESCRIPCION, NUMGRUP, FECHAINI, 
FECHAFIN
from VTOS
where (NUMGRUP=:NUMGRUP)
and (CURRENT_DATE between FECHAINI and FECHAFIN)
order by NUMGRUP, CODVTO,  fechaini

esto es lo que tengo en insertSQL:
Código SQL [-]
insert into VTOS
  (CODVTO, DESCRIPCION, NUMGRUP, FECHAINI, 
FECHAFIN)
values
  (:CODVTO, ESCRIPCION, :NUMGRUP, :FECHAINI, 
:FECHAFIN)

El código asociado al botón que me inserta un nuevo registro es:

Código Delphi [-]
//==Procedure que genera un nuevo vencimiento en TbVtos
procedure TFrmPagos.BitBtn2Click(Sender: TObject);
Var FrmVtos : TFrmVtos;
begin
     screen.cursor := crHourGlass;
     FrmVtos := TFrmVtos.Create(Self);
     Screen.cursor := crDefault;
     TRY


        FrmDModule.TbVtosVna.Insert;
        FrmVtos.ShowModal;

        
        If FrmVtos.modalresult = mrOk Then Begin
             FrmDModule.TbVtosVna.Post;
             FrmDModule.TbVtosVna.Close;
             FrmDModule.TbVtosVna.Open;
        End  //FIN DE if salimos con OK del modal
        Else Begin
          FrmDModule.TbVtosVna.Cancel;
        End;
     FINALLY
        FrmVtos.Free;
     END;
end;

y el que tengo asociado al botón editar es:

Código Delphi [-]
       screen.cursor := crHourGlass;
       FrmVtos := TFrmVtos.Create(Self);
       Screen.cursor := crDefault;
       TRY
         FrmDModule.TbVtosVna.Edit;
         
         FrmVtos.ShowModal;
         if FrmVtos.modalresult = mrOk then begin
           FrmDModule.TbVtosVna.Post;
           FrmDModule.TbVtosVna.Close;
           FrmDModule.TbVtosVna.Open;
         end
         else begin
           FrmDModule.TbVtosVna.Cancel;
         end;

       FINALLY
         FrmVtos.Free;
       END;

Espero que ahora esté más claro cual es mi problema.

Gracias de ante mano a todos,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #7  
Antiguo 01-06-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Giniromero
Conclusión sólo me da problemas para modificar
campos date que inicialmente estaban vacíos o es null.
Primero que nada te advierto que yo no sé nada de Interbase por lo que a lo mejor digo una burrada. Pero leyendo tus mensajes creo saber cuál es el problema. De hecho hice una pequeña prueba en Paradox y más o menos pude recrear el problema. Digo más o menos porque en el caso de Paradox, al intentar actualizar un registro donde el campo DATE era nulo no sólo no me actualiza sino que de hecho me lanza una excepción.

Creo que el punto es que los valores NULL no pueden compararse con una igualdad. En tu sentencia UPDATE:

Código SQL [-]
update VTOS
set
  CODVTO = :CODVTO,
  DESCRIPCION = ESCRIPCION,
  NUMGRUP = :NUMGRUP,
  FECHAINI = :FECHAINI,
  FECHAFIN = :FECHAFIN
where
  CODVTO = :OLD_CODVTO and
  NUMGRUP = :OLD_NUMGRUP and
  FECHAINI = :OLD_FECHAINI

el valor de :OLD_FECHAINI será NULL en el caso problemático de manera que la condición realmente se ve así:

FECHAINI = NULL

pero esta condición siempre será falsa ya que la comparación con NULL se hace con el operador IS en lugar del operador de igualdad.

En el caso de Paradox pude corregir el problema sustituyendo la condición por

(FECHAINI = :OLD_FECHAINI or FECHAINI is null)

Te repito que de Interbase no sé nada pero juraría que aquí está el problema: no encuentra el registro que hay que actualizar dado que la condición siempre valúa a FALSE.

Espero que esto te ayude.

// Saludos
Responder Con Cita
  #8  
Antiguo 01-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
El punto es que en el where de la sentencia del ModifySQL, debieran incluirse solamente los campos de la llave primaria, en el entendido que al ser de esta manera, los campos no serán null.

De cualqueir forma, con una serie de and's y or's podria hacerse funcionar de esta forma, pero no tiene sentido, pues la llave primaria es suficiente para identificar univocamente al registro.

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
  #9  
Antiguo 01-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

ups.. no habia visto esto...

Cita:
Empezado por roman
En el caso de Paradox pude corregir el problema sustituyendo la condición por

(FECHAINI = :OLD_FECHAINI or FECHAINI is null)
Lo cierto es que aqui se actualizarián Todos los registros para cuya FechaIni registrada sea null y se cumplan las otras dos condiciones... aún cuando old_fechaini SI tenga un valor y este no coincida con el de FechaIni de tales registros.

Me parece que la siguiente sentencia sería mas correcta (sin embargo puede dar lugar todavía a actualizaciones erroneas:
Código:

and ((FechaIni = :or_fechaini) or ((fechaini is null) and (:old_fechaini is null)))
Como he dicho en mi intervención anterior, la única forma de asegurar que se actualizará el registro correcto (y solo ese) es usar la llave primaria en el where, y si ya se uso la llave primaria completa (que no podria tener nulos), no tiene sentido comparar otros campos.

Hasta luego.

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

Última edición por jachguate fecha: 01-06-2004 a las 08:16:45.
Responder Con Cita
  #10  
Antiguo 01-06-2004
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Muchas gracias por la ayuda, efectivamente, parece que se ha solucionado cambiando el código del ModifySQL:

Código SQL [-]
update VTOS
set
  CODVTO = :CODVTO,
  DESCRIPCION = ESCRIPCION,
  NUMGRUP = :NUMGRUP,
  FECHAINI = :FECHAINI,
  FECHAFIN = :FECHAFIN
where
  CODVTO = :OLD_CODVTO

de modo que en el where sólo me muestra el campo que es primary key, pero no los otros campos que aparecían antes.

No me había dado cuenta, que esos campos son por lo que quiero ordenar los registros, y que no son clave primaria, sino secundaria.

Muchas gracias a todos por la ayuda.

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #11  
Antiguo 01-06-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por jachguate
Como he dicho en mi intervención anterior, la única forma de asegurar que se actualizará el registro correcto (y solo ese) es usar la llave primaria en el where, y si ya se uso la llave primaria completa (que no podria tener nulos), no tiene sentido comparar otros campos.
Desde luego esto es cierto, pero el qué campos sea más correcto o no usar para la actualización es harina de otro costal. El punto me parece es que el hecho de que en algunos casos el campo fecha fuera null es lo que impedía, tal como estaba la sentencia, que se hiciera la actualización.

// Saludos
Responder Con Cita
Respuesta



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 13:23: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