PDA

Ver la Versión Completa : Actualizar tabla


Alejandrina
26-04-2007, 00:29:50
Hola a todos,
Tengo el siguiente problema y es que necesito actualizar los datos en una tbl pero el procedimiento que tengo solo lo hace con el primer registro, que error tengo?


DmProcedimientos.QTerminarSolicitudes.params[0].assmallint := strtoint(DBENumeroSolicitud.text);;
DmProcedimientos.QTerminarSolicitudes.Close;
DmProcedimientos.QTerminarSolicitudes.open;
while not DmProcedimientos.QTerminarSolicitudes.eof do
begin
DmSip.TblSolicituDiarios.edit;
Dmsip.TblSolicituDiarios['HORATERMINACION']:=horaFinSolicitud;
Dmsip.TblSolicituDiarios['ESTADO']:=estado;
Dmsip.TblSolicituDiarios['DESCRIPACT']:=descripAct;
DmSip.TblSolicituDiarios.post;
DmProcedimientos.QTerminarSolicitudes.next;
end;


:) Gracias por la ayuda que me puedan brindar:)

basti
26-04-2007, 00:45:30
El problema está en que estás recorriendo un DataSet y actualizando en otro.
Puedes explicar lo que es QTerminarSolicitudes y TblSolicituDiarios para ayudarte mejor, sobre todo si están relacionados de alguna manera.

Lepe
26-04-2007, 13:16:59
Ese bucle que haces es muy costoso, es más rápido una consulta de este tipo:

update solicituDiarios
set HORATERMINACION = :horaFinSolicitud,
ESTADO = :estado;
DESCRIPACT' = :descripAct
where NumeroSolicitud = :numero;



query1.sql.text := todo el texto anterior;
query1.parambyname('horaFinSolicitud').AsDatetime := datetimepicker1.date;
query1.parambyname('estado').AsXXXX := lo que sea
query1.parambyname('descripAct').AsXXXX := lo que sea;
query1.parambyname('numero').AsInteger := strtoint(dbenumero.text);
query1.ExecSql;

con eso actualizarás todos los registros de la tabla solicitudDiarios.

Busca un manual de Sql si tienes ansiedad ;) :cool:

Alejandrina
09-06-2007, 01:22:54
Hola, aun tengo problemas con guardar en tablas :confused:
Lo que pasa es lo siguiente:
Pretendo que cuando un elemento es seleccionado de un DBLookupComboBox este se grabe en la TblEnsamble y visualice los datos de este dato en un TDBGrid, asi que hago lo siguiente

procedure TFrmOrdenProceso.DBLOrdenCloseUp(Sender: TObject);
begin
DmSip1.TblEnsamble.edit;
DmSip1.TblEnsamble['DOCENSAMBLE']:=DBEDocumentoE.Text;
DmSip1.TblEnsamble['DOCORDEN']:=DBLOrden.Text;
DmSip1.TblEnsamble.Post;
end;

asi para guardar la relacion en la TblEnsable, pero cuando reviso la tabla siempre hay un solo registro, y fuera de esto no me esta mostrando los datos en el TDBGrid.
Espero haberme explicado bien al igual que espero que me puedan colaborar, de ante mano muchas gracias:p

Lepe
09-06-2007, 12:35:16
Yo no usaría el evento CloseUp, ya que el usuario puede equivocarse con facilidad y grabar más registros de los que realmente quiere. Pondría un botón guardar.

Es lógico que solo guarde 1 registro, porque haces un TblEnsamble.edit, es decir, Editar el registro actual de la tabla Ensamble. Tendrás que hacer un TBlEnsamble.Insert o Append para añadir un registro nuevo al presionar el botón que dije al principio.

Para que el Grid muestre los datos, debes hacer una relación Maestro-detalle. Hay varias formas de hacerlo. Busca en el foro y si tienes dudas las comentas.

Saludos

Alejandrina
13-06-2007, 15:51:06
Hola,
Lepe tenias toda la razón cambie el edit por el insert :o y ahora guarda todos los datos pero tambien hice la relación maestro-detalle pero el TDBGrid solo me muestra un registro (el segundo dato que ingreso no inserta en el TDBGrid los datos que se ingresan). Que puedo mirar para que este TDBGrid muestre cada uno de los datos que el usuario esta ingresando? (El DataSource del TDBGrid es una vista esto influye en algo?).
Y pues la parte del control de registros a grabar la pensaba manejar con un TDBNavigator, la idea es que visualice los datos y si alguno no va lo quita.

Alejandrina
13-06-2007, 17:50:35
Bueno ya revise de nuevo y efectivamente hice la relacion del cod de la vista con el cod de la otra tabla, pero aun asi sigue sin mostrarme los datos, y pues no estoy usando commit...¿que mas podra ser?

Muchas gracias por tu ayuda

Lepe
13-06-2007, 17:50:36
Lo primero es asegurarse que los registros que se dan de alta, forma parte de la relación Maestro-Detalle. En dicha relación siempre hay un campo en común en el Maestro y Detalle. Si olvidas asignar ese campo en el detalle, el registro no formará parte de la Relación y nunca aparecerá en pantalla (aunque puede estar en la tabla guardado en la tabla detalles).

Otra cosa que puede estar fallando es el tipo de transacción que hagas, ya que usas vistas, me parece un motor cliente/servidor, y si aquí usas Commit, los cambios no se reflejan hasta cerrar la consulta y volverla a abrir.

Saludos.