PDA

Ver la Versión Completa : ultimo registro


edgar_prospero
25-04-2012, 02:41:48
que hay ojala y puedan ayudarme con lo siguiente:

tengo una base de datos en mysql en la cual tengo una tabla llamada datos de ahi lo que quiero lograr es traerme el ultimo registro de un campo
llamado folio y mostrarlo en un edit este es parte de mi codigo pero no me funciona ojala puedan decirme en que ando mal

procedure TForm1.FormActivate(Sender: TObject);
begin

query.Close;
query.SQL.Text:='SELECT * FROM datos ORDER BY DESC LIMIT 1';
query.Params[0].Value:=folio.Text;
query.Open;
query.ParamByName('folio').AsString:=folio.Text;
end;

Caral
25-04-2012, 02:46:36
Hola
No estoy muy seguro en MySql:
procedure TForm1.FormActivate(Sender: TObject);
begin
query.Close;
query.SQL.Text:='SELECT LAST(folio) as folio From Datos ';
query.Open;
Edit1.text:= query.FileByName('folio').AsString;
end;
No entiendo por que llamar a todos los datos (campos) de la tabla si solamente necesitas uno.?
Saludos

kapcomx
25-04-2012, 03:14:09
Amigo Caral, tengo ala mano Mysql 5.0 y la consulta qe pones no funciona....:cool:.

Amigo Edgar siento que atu consulta le falta algo???


Código Delphi [-] (http://www.clubdelphi.com/foros/#)'SELECT * FROM datos ORDER BY DESC LIMIT 1';




creo que despues del order by... te falta indicar un campo no crees

algo asi como order by folio desc....

Saludos...:cool:

Caral
25-04-2012, 03:17:34
Hola
Amigo Caral, tengo ala mano Mysql 5.0 y la consulta qe pones no funciona....:cool:.


Y yo con lo feliz que estaba de pegar una....:o:D
Saludos

AzidRain
25-04-2012, 03:52:35
Consulta correcta:

SELECT MAX(folio) as max_folio From Datos;


OJO: Esto no te va a servir si lo quieres ocupar para obtener un folio para una factura o algo similar ya que hay que tomar en cuenta la concurrencia, es decir, el valor obtenido puede no ser el mismo al momento en que vayas a guardarlo finalmente.

Si quieres te pongo un ejemplo de como hacerlo (en MySQL) y garantizarte que nunca se te vaya a duplicar un folio.

edgar_prospero
25-04-2012, 16:24:24
amigo AzidRain si me gustaria que pusieras el ejemplo que me mencionas te lo agradeceria

edgar_prospero
25-04-2012, 18:39:20
he logrado que me muestre el ultimo registro con el siguiente codigo

procedure TForm1.FormActivate(Sender: TObject);
begin
query.Close;
query.SQL.Text:='SELECT folio FROM datos ORDER BY folio desc LIMIT 1';
query.Open;
folio.text := query.FieldByName('folio').asString ;

end;

pero lo que me falta lograr es aumentarle uno a ese ultimo registro por ejemplo si mi ultimo registro es el 26 que en el edit me muestre el 27 para empezar a guardar informacion ahi no se si me explique

AzidRain
25-04-2012, 19:36:53
Te pongo un ejemplo de como lograr lo que necesitas.

Requisitos Previos:

La tabla donde vas a llevar el control de folios debe ser InnoDB ya que vamos a utilizar transacciones, aqui tienes un script para crearla:


CREATE TABLE `folios_facturas` (
`sucursal` varchar(3) NOT NULL DEFAULT '',
`ultimo_folio_talon` int(11) DEFAULT NULL,
`ultimo_folio_cfd` int(11) DEFAULT NULL,
`serie_fiscal` varchar(5) DEFAULT NULL,
PRIMARY KEY (`sucursal`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


En este ejemplo tenemos 4 campos, puedes usar los que necesites segun los folios que quieras controlar, bastaria con tener solo uno que contenga el ultimo folio de factura utilizado. Vamos a dejar sin uso el campo sucursal y serie fiscal. Asi que inicializamos la tabla creando un registro que contenga los folios con que iniciamos


INSERT FOLIOS_FACTURAS SET ULTIMO_FOLIO_talon=1, SUCURSAL="X";


Ahora si ya podemos empezar a actualizar la tabla segun los folios que vayamos ocupando, yo lo hago mediante la siguiente función que me da el folio que voy a utilizar.



function GetFolios(var aFolioCFD,aFolioTalon:Integer;var aSerieFiscal: string; aSucursal:string):Boolean;
begin
Result := FALSE;
capadatos.StartTrans; // Iniciamos la transacción
with Capadatos.QueryCreate('UPDATE FOLIOS_FACTURAS SET ULTIMO_FOLIO_TALON=ULTIMO_FOLIO_TALON+1, ULTIMO_FOLIO_CFD=ULTIMO_FOLIO_CFD+1 WHERE SUCURSAL=:SUCURSAL') do
Try
Try
ParamByName('SUCURSAL').AsString := aSucursal;
ExecSQL; // Se ejecuta el query para aumentar el folio
SQL.Clear;
SQL.Add('SELECT * FROM FOLIOS_FACTURAS WHERE SUCURSAL=:SUCURSAL');
ParamByName('SUCURSAL').AsString := aSucursal;
Open;
aFolioTalon := FieldByName('ULTIMO_FOLIO_TALON').AsInteger; //Leemos los folios ya actualizados
aFolioCFD := FieldByName('ULTIMO_FOLIO_CFD').AsInteger;
aSerieFiscal := FieldByName('SERIE_FISCAL').AsString;
Close;
Capadatos.Commit; //Cerramos la transacción
Result := True;

Except
capadatos.RollBack; // Si algo falla, abortamos la transacción y el folio permanece sin cambios
end;
Finally
Free;
End;
end;


Yo utilizo Zeos para hacer el acceso a datos, pero lo puedes modificar sin problema para usar cualquier componente.

Ahora bien, para usar la función hacemos:

1.- Editamos los datos de la factura, documento o lo que sea (excepto el folio, ese lo dejamos al final)
2.- Llamamos a la funcion que nos dará el folio
3.- Guardamos la factura con el folio que obtuvimos.

También puedes abrir la transacción antes de llamar a la funcion y cerrarla justo despues de guardar la factura.

Efecto:

Mientras esta abierta la transacción, cualquier otro usuario no podrá obtener un numero de folio hasta que se cierre o aborte la transacción. De esta forma nunca habrá la posibilidad de que 2 usuarios obtengan el mismo folio.

edgar_prospero
26-04-2012, 18:32:02
excelente respuestas me ayudo bastante muchas gracias