Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Como realizar proceso automaticamente (https://www.clubdelphi.com/foros/showthread.php?t=80010)

jafera 28-08-2012 19:08:13

Como realizar proceso automaticamente
 
Buenas tardes a todos.

Como siempre D-6 y FB 1.5, de momento no cambio.

Recientemente he añadido a mi tabla un campo que es un código de barra y necesitaria saber como puedo hacer para realizar el código del siguiente procedure de manera que me recalcule la primera vez que entro en el programa los códigos que estan vacios, esto quiero hacerlo de forma transparente al usuario para que este no se estrese, jejeje.

Código Delphi [-]
 
procedure TF_Rebut.JvDBDateEdit1Exit(Sender: TObject);
var Temp,Anyo,Rebut,Arbitre,Codi_B: String;
a,m,d: Word;
begin
        DecodeDate(F_ModulDades.RebutDATA.Value, a,m,d);
        Anyo:= IntToStr(a);
        Temp:='0000';
        Delete(Temp,1,Length(IntToStr(F_ModulDades.RebutID_REBUT.Value)));
        Rebut:=Concat(Temp+IntToStr(F_ModulDades.RebutID_REBUT.Value));
        Temp:='00';
        Delete(Temp,1,Length(IntToStr(F_ModulDades.RebutID_USUARI.Value)));
        Arbitre:=Concat(Temp+IntToStr(F_ModulDades.RebutID_USUARI.Value));
        Codi_B:=(Anyo+Rebut+Arbitre+'000');
        CodiCorrecte(Codi_B);
        F_ModulDades.RebutCODI_BARRES.Value:=Codi_B;
end;

Este código se realiza correctamente en los nuevos registros, pero no se como realizar un bucle que busque los que estan vacios y lo rellene.

Para actualizar tablas a la base de datos desde delphi uso un IBScript, no se si será algo parecido.

Si alguien me puede echar un cable pues como siempre enormemente agradecido.

Saludos

Josep

roman 28-08-2012 19:16:06

¿Por qué no haces un programita aparte que te rellene todos los registros existentes?

// Saludos

jafera 28-08-2012 19:34:33

Si, es lo que necesitaría hacer pero no se como.

Un IBScript con un update ?

Gracias

Josep

roman 28-08-2012 19:40:12

No uso firebird, pero no creo que sea algo especial de este gestor. Yo lo que haría es usar un query para obtener todos los registros con ese campo vacío, algo como

Código SQL [-]
select * from tabla where codigo_barras = ''

o

Código SQL [-]
select * from tabla where codigo_barras is null

según corresponda.

Entonces, la actualización la haces sobre ese query, recorriendo todos sus registros en un ciclo.

// Saludos

jafera 28-08-2012 21:35:03

Gracias Román.

El problema que tengo es como paso todo lo que hace el procedure que puse en el primer post en una consulta update, aquí es donde estoy encallado.

Saludos

Josep

ecfisa 28-08-2012 22:48:30

Hola Josep.

Lo que no me termina de quedar claro es como deseas que se arme la cadena que se almacena en Codi_B.

¿ Podrías poner una muestra de como queres componerla ?

Como por ejemplo:
Código:

fecha    | ID_Rebut | ID_Usuari
---------+----------+-----------
20120828 | 00001    | 001

Saludos.

roman 28-08-2012 23:09:18

Cita:

Empezado por jafera (Mensaje 440958)
Gracias Román.

El problema que tengo es como paso todo lo que hace el procedure que puse en el primer post en una consulta update, aquí es donde estoy encallado.

Saludos

Josep

Creo que no nos estamos entendiendo. En tu rutina, después de cálculos que haces, terminas asignando el valor final al campo de tu base:

Código Delphi [-]
F_ModulDades.RebutCODI_BARRES.Value:=Codi_B;

O sea que, imagino, Rebut es un dataset conectado a tu tabla. Bueno, lo que yo digo es que uses un query, digamos QueryRebut con una consulta como la que te puse y hagas:

Código Delphi [-]
while not QueryRebut.Eof do
begin
  {
    Aquí los cálculos
  }
  QueryRebut['CODI_BARRES'].Value:=Codi_B;
  QueryRebut.Next;
end;

// Saludos

jafera 28-08-2012 23:10:36

Gracias ecfisa

El codigo se compone con el año de la fecha (cuatro cifras), el id del recibo (cuatro cifras) y el id del usuario (dos cifras) más tres ceros es decir:

2012 0001 01 000

luego con la funcion codigocorrecto sustituyo el ultimo cero por el valor de control correcto.

Saludos

Josep

jafera 28-08-2012 23:28:12

Gracias Román.

Si te he entendido, lo que no se es como hacer los calculos en el bucle para poder obtener Codi_B.

Creo que con esta aclaración que me has pasado voy a probar mañana si lo consigo.

Josep

jafera 29-08-2012 14:31:13

Solucionado.

Código Delphi [-]
 
procedure TF_Inici.Codi_B;
var Temp,Anyo,Rebut,Arbitre,Codi_B: String;
 a,m,d: Word;
begin
        Codis_B.Close;
        Codis_B.Open;
        F_ModulDades.Rebut.Close;
        F_ModulDades.Rebut.Open;
        while not Codis_B.Eof do
        begin
                F_ModulDades.Rebut.Locate('ID_REBUT', Codis_BID_REBUT.Value,[]);
                F_ModulDades.Rebut.Edit;
                DecodeDate(Codis_BDATA.Value, a,m,d);
                Anyo:= IntToStr(a);
                Temp:='0000';
                Delete(Temp,1,Length(IntToStr(Codis_BID_REBUT.Value)));
                Rebut:=Concat(Temp+IntToStr(Codis_BID_REBUT.Value));
                Temp:='00';
                Delete(Temp,1,Length(IntToStr(Codis_BID_USUARI.Value)));
                Arbitre:=Concat(Temp+IntToStr(Codis_BID_USUARI.Value));
                Codi_B:=(Anyo+Rebut+Arbitre+'000');
                F_Rebut.CodiCorrecte(Codi_B);
                F_ModulDades.RebutCODI_BARRES.Value:=Codi_B;
                F_ModulDades.Rebut.Post;
                Codis_B.Next;
        end;
end;

He creado esta funcion en el Form Inicio para que la consluta Codis_B busque los codigos vacios y con el eof -> Next lo recorro rellenando los valores que faltan.

Funciona de maravilla

Gracias a todos por vuestroa ayuda, a veces no veo más allá de mi nariz y veía como hacerlo pero no encontraba la manera de aplicarlo, jejeje...

Josep


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

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