PDA

Ver la Versión Completa : Como realizar proceso automaticamente


jafera
28-08-2012, 19:08:13
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.


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


select * from tabla where codigo_barras = ''


o


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:

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


Saludos.

roman
28-08-2012, 23:09:18
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:


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:


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.


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