Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   ultimo registro (https://www.clubdelphi.com/foros/showthread.php?t=78498)

edgar_prospero 25-04-2012 02:41:48

ultimo registro
 
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

Código Delphi [-]
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:
Código Delphi [-]
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

Mysql
 
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 [-]'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
Cita:

Empezado por kapcomx (Mensaje 430868)
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:
Código SQL [-]
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

Código Delphi [-]
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:

Código SQL [-]
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

Código SQL [-]
  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.

Código Delphi [-]

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


La franja horaria es GMT +2. Ahora son las 12:12:31.

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