FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
registro current y bookmarks
Hola a todos,
sigo con mi eterna aplicación de delphi 6, que estaba en paradox, y que estoy pasando a Interbase 7 y pasando los DBE a FIB el caso es que se podría decir que uno de los procedures que tengo, "trabaja bien", esto es, cuando tiene que guardar datos en un registro, los guarda, en los campos correspondientes, el problema es que no lo hace en el registro adecuado, lo cual es un problema. Lo primero me crea un registro nuevo en la tabla A, pero al hacer el Post, comienzan mis problemas. 1º si simplemente hago el post, se mantiene en el mismo registro, pero sin actualizar mis datos, aunque tengo asociada a mi tabla un afterPost , IBTransFX.CommitRetaining; Donde IBTransFX es la transacción que gestiona mi tabla A. 2º Si a esto le añado un refresh, entonces me actualiza el campo, pero se me situa en otro registro, de hecho lo hace en el primero de Tgrid que tengo asociado a dicha tabla. Aquí me surgen dos dudas la primera duda, ¿porqué tras el post no me actualiza, teniendo asociado el evento afterPost , con el IBTransFX.CommitRetaining? Creía que esto, era suficiente para actualizar la tabla. la segunda, ¿si pongo un getBookmark en este registro, justo antes de hacer el post, podría volver a este registro, después de refresh, con el GotoBookmark? Gracias Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
#2
|
|||
|
|||
Hola,
Que estas haciendo un insert o un update? |
#3
|
|||
|
|||
Estoy haciendo un Append.
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
#4
|
|||
|
|||
Hola,
Por lo que veo, tienes un select para mostrar los registros y un procedimiento por el cual insertas. Si es asi como la inserción se realiza en otro proceso, debes refrescar el select para que te muestre los cambios. Lo que puedes hacer es que el procedimiento te devuelva la clave primaria del registro, la cual tu puedes usar para despues del refresco irte a ese registro. Lo del Bookmark no te vale pues la insersión la hace el procedimiento, no la vista con la que muestras los datos. Espero no haberme equivocado, ya que me estoy lanzando a contestar, cuando lo que más hago es preguntar. Un saludo |
#5
|
|||
|
|||
Cita:
el append lo hago directamente en el código fuente. Cita:
Cita:
Muchas gracias, en cualquier caso, por intentar ayudarme. Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
#6
|
|||
|
|||
Hola,
Tu texto inicial me despisto un poco. -- el caso es que se podría decir que uno de los procedures que tengo, "trabaja bien", esto es, cuando tiene que guardar datos en un registro, los guarda, en los campos correspondientes, el problema es que no lo hace en el registro adecuado, lo cual es un problema. -- Yo nunca he usado TTable con interbase, solo con ADO y hace unos añillos de eso. Yo los codigo nunca los genero con generadores, asi que no sabria darte una idea al respecto -- a que te refieres con esto? , creo que no te he entendido. -- Creia que el insert lo hacias con un procedimiento almacenado de interbase y el mostrar los registros con select. Asi que en tu caso es como si no hubiera dicho nada. Creo que deberias mostrar algo de codigo para que lo vemos todos y te podamos ayudar. Un saludo. |
#7
|
|||
|
|||
De todas formas, gracias por tu ayuda Charly.
Este es el código de mis amarguras. Algunos trozos de código no figura, por que esas partes funcionan bien, y no tienen nada que ver con el resto. Lo he quitado para no alargarme, y no liar. En el form desde el que se abre el que tiene este código, y antes de abrirlo, se ha insertado un nuevo registro, usando append, en FrmFxMain.TbEcono. Ese registro es el que me da problemas cuando hago post. //procedure que se activa al pulsar el botón "Aceptar" procedure TFrmEfePago.BitBtn1Click(Sender: TObject); var cEmpresa, cRecibo, cAuxRecibo : string; var lEmpresa, lSigue : boolean; var nAux : Currency; var cCodigo : integer; var dbPos, dbPos2, dbPos3 : TBookMark; begin //=====1 COMPROBAMOS SI SE HA SELECCIONADO ALGÚN REGISTRO PARA PAGAR. // si no hay ninguno seleccionado al pulsar aceptar, salimos sin hacer nada //=====2 COMPROBAMOS SI SE HA SELECCIONADO ALGUNA FORMA DE PAGO //=====3 SI LA FORMA DE PAGO ES COMPENSACIÓN, //nos aseguramos que haya dinero suficiente en el pasivo //si no hay suficiente dinero en pasivo, lo avisamos y salimos del procedure //=====4 SI HAY FORMA DE PAGO SELECCIONADA, Y REGISTROS MARCADOS PARA SER PAGADOS //========AVERIGUAMOS LA EMPRESA QUE LO VA A FACTURAR //según el código anterior vemos que empresa lo factura TRY //ponemos una marca en el registro actual de la tabla TbEcono, que es el del //registro antiguo que ahora estamos pagando dbPos2 := TbEcono.GetBookmark; TbEcono.DisableControls; // esta tabla, es la que tiene los posibles registros que puedo pagar TbEcono.First; While Not TbEcono.EOF Do Begin //si el campo ASIENTO es igual a 1, es un pago que se ha seleccionado para ser pagado if TbEconoASIENTO.Value = 1 then begin //si lEmpresa está como true IF lEmpresa THEN BEGIN //la empresa que lo paga es la que está en EMPASO cEmpresa := TbEmpresasEMPASO.Value; END ELSE BEGIN //la empresa que lo paga es la que está en CODIGO cEmpresa := TbEmpresasCODIGO.Value; END; break; end; TbEcono.Next; End; FINALLY TbEcono.GotoBookmark(dbPos2); TbEcono.FreeBookmark(dbPos2); TbEcono.EnableControls; END; //=====5 CALCULAMOS EL NÚMERO DE RECIBO DE LA TRANSACCIÓN TbEmpresasAux.Locate('codigo',(cEmpresa), [locaseInsensitive]); TbForPago.Locate('codigo',(FrmFxMain.TbEconoFORPAGO.AsVariant), [locaseInsensitive]); {Calcular el número de recibo que vamos a asignar a TbEconoRECIBO} if TbForPagoNONUMERAR.Value ='T' then begin cRecibo := 'No Emitido'; end else begin cRecibo := TbEmpresasAuxNUMRECIBO.Value; showmessage ('Recibo anterior' + cRecibo ); cAuxRecibo := '0000000' + inttostr(strtoint(Copy(cRecibo, 4, 7)) + 1); cAuxRecibo := Copy(cAuxRecibo, length(cAuxRecibo)-6, 7 ); TbEmpresasAux.Edit; TbEmpresasAuxNUMRECIBO.Value := Copy(cRecibo, 1, 3) + cAuxRecibo; showmessage ('recibo próximo' + TbEmpresasAuxNUMRECIBO.AsString ); TbEmpresasAux.Post; TbEmpresasAux.Refresh; end; //guardamos los datos introducidos al abrir este Form para que se nos genere el //valor del campo CODIGO, y poder trabajar con él después FrmFxMain.TbEcono.Post; dbPos3 := FrmFxMain.TbEcono.getbookmark; FrmFxMain.TbEcono.Refresh; FrmFxMain.TbEcono.GotoBookmark(dbPos3); //me va siempre al último registro, no al registro en el que estaba //después tomamos el valor que para este registro tenemos en la tabla econo cCodigo := FrmFxMain.TbEconoCODIGO.Value; FrmFxMain.TbEcono.Edit; //guardamos los cambios de los datos que hemos añadido en la tabla TbEcono, de fxMain FrmFxMain.TbEconoASIENTO.Value := cCodigo; FrmFxMain.TbEconoRECIBO.Value := cRecibo; FrmFxMain.TbEcono.Post; FrmFxMain.TbEcono.Refresh; //=====6 SI LA F.P. ERA 90, RESTO AL PASIVO LO QUE SE HA ABONADO //====7 GUARDO EL NÚMERO DE RECIBO, Y ASIENTO ADECUADO TbEcono TRY TbEcono.DisableControls; TbEcono.First; While not TbEcono.EOF do begin if TbEconoASIENTO.Value = 1 then begin //edito el registro antiguo que estamos pagando TbEcono.Edit; //guardo en la tablaEcono, en el campo ASIENTO, el mismo que tenga //el registro que está abonando TbEconoASIENTO.Value := cCodigo; TbEconoRECIBO.Value := cRecibo; TbEcono.Post; TbEcono.Refresh; end; TbEcono.Next; end; FINALLY TbEcono.EnableControls; FrmFxMain.TbEcono.Refresh; END; end;
__________________
Sonrie al mundo, y el mundo te sonreirá :) Última edición por Giniromero fecha: 10-07-2003 a las 16:05:48. |
#8
|
|||
|
|||
Por cierto, NO ESTOY USANDO TTables sino TIBTabes.... que no es lo mismo.
gracias Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
#9
|
|||
|
|||
Hola,
He mirado tu codigo, y el post que te falla lo usas para rellenar la variable cCodigo, no? Mira yo he probado lo siguiente : // EN FIREBIRD en una tabla de articulos tengo un campo CODIGO_BARRAS que se rellena en un After Insert de la tabla ARTICULO con el siguiente codigo, lo cual creo que funciona igual que lo que tu haces con tu generador; /* asignacion automatica del codigo de barras */ execute procedure a_art_asigna_cb(new.empresa) returning_values new.codigo_barras; // EN DELPHI en el AfterPost de ARTICULO procedure TDMArticulos_Alm.QArticuloAfterPost(DataSet: TDataSet); begin if lNuevo then begin Graba(DataSet); end; lNuevo := false; // ME MUESTRA EL CODIGO (AQUI PODRIAS TU, DAR VALOR A cCodigo, no? showmessage(QArticuloCODIGO_BARRAS.AsString); ?? cCodigo := TbEconoCODIGO.Value; // sistema de propagación entre empresas with SPPropagacion do begin ParamByName('empresa').Value := EMPRESA; ParamByName('referencia').Value := QArticuloREFERENCIA.Value; ExecProc; Close; TLocal.CommitRetaining; end; end; procedure TDMArticulos_Alm.Graba(DataSet: TDataSet); begin TpFIBDataSet( DataSet ).Transaction.CommitRetaining ; end; Yo uso Firebird + FIBPlus + Delphi 7 No se es un ejemplo que se me ha ocurrido, para probar. Dime algo, (esto lo arreglamos ya por cabezoneria :-)) Un saludo. Última edición por charly fecha: 10-07-2003 a las 18:03:40. |
#10
|
|||
|
|||
¡¡¡¡¡ME FUNCIONA!!!!
Muchas Gracias por tu ayuda. No sabes como te lo agradezco. A ver si la próxima vez te puedo ayudar en algo, yo a ti. Saludos Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
|
|
|