Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Datos de una tabla a otra (https://www.clubdelphi.com/foros/showthread.php?t=61182)

lKinGl 28-10-2008 23:26:17

Datos de una tabla a otra
 
Salu2 amigos foristas...

tengo un formulario que tiene lo siguiente:

2 combobox
1 edit
3bitbtn

lo que se quiere es lo siguiente:

en la misma aplicacion hay un formulario el cual se llena una base de datos....bla bla bla..

y en el formulario actual necesito cargar una nueva base de datos provenientes de la nombrada anteriormente (por que la primera que mencioné es temporal)....

y necesito que si un registro de la table14 tiene todos los campos igual a los de table11 entonces no debe pasar nada de lo contrario agregarlos

por que despues debo mostrar un quickreport con lo filtrado con los combobox 1 y 2

en el boton aceptar tengo este código, no da error, pero no cumple con lo que necesito:

Código Delphi [-]
var
mes,ano,grupo,descr:String;
fecha:TDate;
deber,haber:Double;
Reg:Boolean;
begin
if form1.Table14.RecordCount<1 then
  begin
    form1.Table11.First;
      with form1.Table14 do
        begin
          while not Eof do
            begin
              Insert;
              FieldValues['fecha']:=form1.Table11.FieldValues['fecha'];
              FieldValues['Grupo']:=form1.Table11.FieldValues['Grupo'];
              FieldValues['Des_cu']:=form1.Table11.FieldValues['desc_cu'];
              FieldValues['debe']:=form1.Table11.FieldValues['debe'];
              FieldValues['haber']:=form1.Table11.FieldValues['haber'];
              Post;
            end;
            Next;
        end;
  end
  else
  begin
    With form1.Table11 do
      begin
        while not Eof do
          begin
            fecha:=FieldValues['fecha'];
            grupo:=FieldValues['grupo'];
            descr:=FieldValues['desc_cu'];
            deber:=FieldValues['debe'];
            haber:=FieldValues['haber'];
              With Form1.Table14 do
                begin
                  if (fecha=form1.Table11.FieldByName('fecha').AsDateTime) and (grupo=form1.Table11.FieldByName('grupo').AsString) and (descr=form1.Table11.FieldByName('desc_cu').AsString) and (deber=form1.Table11.FieldByName('debe').AsFloat) and (haber=form1.Table11.FieldByName('haber').AsFloat) then
                    begin
                      Reg:=true;
                    end
                    else
                    begin
                      Reg:=False;
                    end;
                end;
            if Reg = False then
              begin
                With form1.Table14 do
                  begin
                    Insert;
                    FieldByName('fecha').AsDateTime:=fecha;
                    FieldByName('grupo').AsString:=grupo;
                    FieldByName('desc_cu').AsString:=descr;
                    FieldByName('debe').AsFloat:=deber;
                    FieldByName('haber').AsFloat:=haber;
                    Post;
                  end;
              end;
          end;
        Next;
      end;
  end;

if ComboBox1.Text='Seleccione Mes' then
  begin
    Application.MessageBox('Disculpe, debe seleccionar un Mes','');
    exit;
  end;

if ComboBox2.Text='Seleccione Año' then
  begin
    Application.MessageBox('Disculpe, debe seleccionar un Año','');
    exit;
  end;

mes:=IntToStr(ComboBox1.ItemIndex+1);
ano:=ComboBox2.Text;
edit1.Text:='01'+'/'+mes+'/'+ano;

with Form45.Query1 do begin
   Close;
   SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber '+
             'from costosygastos.db '+
             'where Extract(month from fecha) = '+IntToStr(MonthOf(StrToDate(Edit1.Text)))+
             ' and Extract(year from fecha) = '+IntToStr(YearOf(StrToDate(Edit1.Text)));
   Open;
end;
form45.QRLabel1.Caption:='Costos y Gastos de '+ComboBox1.Text+' de '+ComboBox2.Text;
form45.QuickRep1.Preview;
exit;
end;

Agradezco mucho su tiempo ...

Fenareth 29-10-2008 01:07:18

Hola lKinGl !

Por lo que pude revisar hasta que me fui, tienes unos errores en cuanto a las referencias a las tablas...

Sigo viendo algunos detalles interesantes de tu código, espero poder terminar de checarlos y ayudarte...

Saluditos ;)

Caral 29-10-2008 01:49:12

Hola
Me da la impresión de que se complica el código y la esencia de lo que se quiere hacer.
Comprobar todo el contenido me parece complicado, tedioso, lento etc.
Yo lo que haría es comprobar un campo determinado, no se, tal vez un numero único y si este ya existe entonces que se cumplan las condiciones que necesites.
Bueno, es solo una opinión, veo que Fenareth te esta ayudando, ella sabrá que es lo mejor en este caso.
Saludos

lKinGl 29-10-2008 02:08:51

correcto caral pero en la tabla origen no hay campo clave

Caral 29-10-2008 02:14:12

Hola
Pero que importa que no tenga un campo clave?.
Cualquier campo sirve, cualquier dato que no se repita.
No conozco tu tabla, pero siempre hay algo de donde agarrarse.
Saludos

lKinGl 29-10-2008 02:20:49

necesito es comparar porque puedo tener exactamente la misma linea pero si tiene distinto un monto debe agregarse osea por una minima diferencia debe agregarse de lo contrario se omite .... pero lo que se omite debo estar 100% seguro que esta repetido

Caral 29-10-2008 02:29:47

Hola
No se exactamente como esta tu tabla ni el contenido, pero una cosa si te puedo decir, usar esto:
Código Delphi [-]
 while not Eof do
            begin
es muy perjudicial, por lo lento, ya que cuando crezca la base de datos costara mas que se haga el recorrido de la misma.
Por eso me da la impresion de que se puede hacer de otra manera.
Saludos

lKinGl 29-10-2008 02:40:48

si te fijas bien si he puesto el while not eof pero en que parte sugieres tu?

y si necesito que el codigo sea lo mas sencillo posible ya que calculo que esta bd crecera como 60 lineas de registros por mes

Fenareth 29-10-2008 04:45:50

Hola lKinGl ! :)

Caral ha dado una idea muy muy buena... que te parece si agregas a tu tabla a comparar un campo único (llave) que sea la concatenación de la información almacenada en tus campos para cada registro (considerando que son pocos campos)...

Después (y ahora si usando FindKey) podría ser más sencillo buscar la cadena concatenada, si es exactamente igual, entonces no guarda el registro, en caso contrario si lo hace...

Esta idea me la compartieron y me pareció bastante interesante para probarla... porqué no haces el intento ? ;)

Saludos

eduarcol 29-10-2008 14:23:25

creo que te estas complicando mas de la cuenta, en la paleta BDE tienes el componente TBatchMove, que configurando sus propiedades segun tus necesidades te sirve para lo que quieres sin escribir tanto codigo.

En la ayuda de Delphi hay un ejemplo muy bueno de como utilizarlo.

Fenareth 29-10-2008 16:10:32

Cita:

Empezado por eduarcol (Mensaje 323088)
creo que te estas complicando mas de la cuenta, en la paleta BDE tienes el componente TBatchMove, que configurando sus propiedades segun tus necesidades te sirve para lo que quieres sin escribir tanto codigo.

En la ayuda de Delphi hay un ejemplo muy bueno de como utilizarlo.

De plano ? :o :rolleyes: :p :D... uno que quiere echarle emoción al asunto pues... :o

eduarcol 29-10-2008 17:44:17

Cita:

Empezado por Fenareth (Mensaje 323113)
De plano ? :o :rolleyes: :p :D... uno que quiere echarle emoción al asunto pues... :o

jajaja mas de una vez me ha sucedido que he inventado la rueda y cuando veo el componente que lo hace lo siento medio aburrido, es mas divertido inventarselo :D

Spynosa 29-10-2008 21:05:10

Que tal un procedimiento almacenado, mas o menos

Código SQL [-]
create procedure elquesea (
  fecha date,
  grupo varchar(6),
  desc_cu varchar (10),
  debe double precision,
  haber double precision,
)
as
begin
  if (not exists(select * from tabla where fecha = :fecha and grupo = :grupo 
        and desc_cu = :desc_cu and debe = :debe and haber = :haber )) then
           insert into tabla (fecha,grupo,desc_cu,debe,haber) 
               values (:fecha,:grupo,:desc_cu,:debe,:haber);
espero que te sirva

lKinGl 31-10-2008 05:04:11

he desarrollado este nuevo codigo ahora con campo único, funciona bien hasta aqui, pero necesito meterle un locate para que verifique antes si el registro esta no se agrega de lo contrario se registra, peroooo al momento de colocar el locate lanza un error no se porque :S

aqui envio mi codigo para ver que se puede hacer :(


Código Delphi [-]
procedure TForm44.BitBtn1Click(Sender: TObject);
var
Fecha:TDate;
unico,Grupo,Des,mes,ano:String;
debe:Double;
begin

With Form1.Table11 do
  begin
    First;
    while not Eof do
      begin
        unico:=FieldValues['unico'];
        if  unico='0' then
          begin
          end
          else
          begin
            With form1.Table14 do
              Begin
                Insert;
                FieldValues['Fecha']:=form1.Table11.FieldValues['Fecha'];
                FieldValues['Grupo']:=Form1.Table11.FieldValues['Grupo'];
                FieldValues['Des_cu']:=Form1.Table11.FieldValues['des_cu'];
                FieldValues['debe']:=Form1.Table11.FieldValues['debe'];
                Post;
              end;
          end;
        Next;
      end;
  end;

if ComboBox1.Text='Seleccione Mes' then
  begin
    Application.MessageBox('Disculpe, debe seleccionar un Mes','');
    exit;
  end;

if ComboBox2.Text='Seleccione Año' then
  begin
    Application.MessageBox('Disculpe, debe seleccionar un Año','');
    exit;
  end;

mes:=IntToStr(ComboBox1.ItemIndex+1);
ano:=ComboBox2.Text;
edit1.Text:='01'+'/'+mes+'/'+ano;

with Form45.Query1 do begin
   Close;
   SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber '+
             'from costosygastos.db '+
             'where Extract(month from fecha) = '+IntToStr(MonthOf(StrToDate(Edit1.Text)))+
             ' and Extract(year from fecha) = '+IntToStr(YearOf(StrToDate(Edit1.Text)));
   Open;
end;
form45.QRLabel1.Caption:='Costos y Gastos de '+ComboBox1.Text+' de '+ComboBox2.Text;
form45.QuickRep1.Preview;
exit;
end;

Gracias Adelantadas

lKinGl 31-10-2008 20:36:51

help me! please :(

lKinGl 02-11-2008 17:24:24

Salu2 ya resolvi mi problema, gracias a los que ayudaron en algo...

publico el código para que a alguien mas le sirva, uno nunca sabe ....

Código Delphi [-]
procedure TForm44.BitBtn1Click(Sender: TObject);
var
mes,ano:String;
begin

if ComboBox1.Text='Seleccione Mes' then
  begin
    Application.MessageBox('Disculpe, debe seleccionar un Mes','');
    exit;
  end;

if ComboBox2.Text='Seleccione Año' then
  begin
    Application.MessageBox('Disculpe, debe seleccionar un Año','');
    exit;
  end;

Form1.Table11.First;
  With Form1.Table11 do
    Begin
      While not Eof do
        begin
            // si el grupo es 6 ó 6
          if (FieldValues['nogrupo']=5) or (FieldValues['nogrupo']=6) then
            begin
              //si consigue unico en la tabla14
              if form1.Table14.Locate('unico',FieldValues['unico'],[]) then
                begin
                  //no pasa nada
                end
                else
                begin
                //de lo contrario graba el registro
                  With form1.Table14 do
                    Begin
                      Insert;
                      FieldValues['unico']:=form1.Table11.FieldValues['unico'];
                      FieldValues['Fecha']:=form1.Table11.FieldValues['Fecha'];
                      FieldValues['Grupo']:=Form1.Table11.FieldValues['Grupo'];
                      FieldValues['Des_cu']:=Form1.Table11.FieldValues['des_cu'];
                      FieldValues['debe']:=Form1.Table11.FieldValues['debe'];
                      Post;
                    end;
                end;
            end;
          Next;
        end;
    End;

mes:=IntToStr(ComboBox1.ItemIndex+1);
ano:=ComboBox2.Text;
edit1.Text:='01'+'/'+mes+'/'+ano;

with Form45.Query1 do begin
   Close;
   SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber '+
             'from costosygastos.db '+
             'where Extract(month from fecha) = '+IntToStr(MonthOf(StrToDate(Edit1.Text)))+
             ' and Extract(year from fecha) = '+IntToStr(YearOf(StrToDate(Edit1.Text)));
   Open;
end;
form45.QRLabel1.Caption:='Costos y Gastos de '+ComboBox1.Text+' de '+ComboBox2.Text;
form45.QuickRep1.Preview;
exit;
end;

Saludos amigos

lKinGl 02-11-2008 17:27:20

uffff en mis códigos anteriores acabo de ver a simple vista un error super grave, que a lo mejor era eso lo que no lo hacia funcionar....

en mi primer código estoy declarando la variable

deber,haberouble;


y es deber, haber: Double;

de igual manera en los demás códigos :S jeje

lKinGl 02-11-2008 17:29:35

bueno supongo que son cosas que simplemente pasan ......


La franja horaria es GMT +2. Ahora son las 17:45:56.

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