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 10-07-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
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á :)
Responder Con Cita
  #2  
Antiguo 10-07-2003
charly charly is offline
Miembro
 
Registrado: may 2003
Posts: 36
Poder: 0
charly Va por buen camino
Hola,
Que estas haciendo un insert o un update?
Responder Con Cita
  #3  
Antiguo 10-07-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Estoy haciendo un Append.
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #4  
Antiguo 10-07-2003
charly charly is offline
Miembro
 
Registrado: may 2003
Posts: 36
Poder: 0
charly Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 10-07-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Cita:
Posteado originalmente por charly

Por lo que veo, tienes un select para mostrar los registros y un procedimiento por el cual insertas...
No, Yo lo que estoy usando son TIBTable, para las tablas que uso, que tienen sus correspondientes MasterSources, que les limitan los registros que tienen que mostrar, (solo me muestra los registros económicos del cliente activo), en el TGrid al que están asociados. Sé que debería usar IBDataSet, pero no sé cómo funciona, y quiero poner el programa primero en marcha, con la misma estructura que tenía para paradox.

el append lo hago directamente en el código fuente.

Cita:
Posteado originalmente por charly
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.
El problema es que esa clave está en el campo código, que es un autonumérico, que se genera directamente el interbase, con un generador, y un tigger. Mientras no se guarda la transaccion, este valor no aparece en la tabla. Y es precisamente cuando hago el refresh y por tanto, se genera un commit en la transacción, cuando se cambia de registro, por lo que no puedo tomar ese dato, para luego hacer un locate o algo así.

Cita:
Posteado originalmente por charly
Lo del Bookmark no te vale pues la insersión la hace el procedimiento, no la vista con la que muestras los datos.
a que te refieres con esto? , creo que no te he entendido.


Muchas gracias, en cualquier caso, por intentar ayudarme.

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #6  
Antiguo 10-07-2003
charly charly is offline
Miembro
 
Registrado: may 2003
Posts: 36
Poder: 0
charly Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 10-07-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 10-07-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Por cierto, NO ESTOY USANDO TTables sino TIBTabes.... que no es lo mismo.

gracias

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #9  
Antiguo 10-07-2003
charly charly is offline
Miembro
 
Registrado: may 2003
Posts: 36
Poder: 0
charly Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 11-07-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Lightbulb

¡¡¡¡¡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á :)
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 23:42:28.


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