Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Consulta con 4 tablas (https://www.clubdelphi.com/foros/showthread.php?t=49182)

Caral 15-10-2007 19:00:45

Consulta con 4 tablas
 
Hola a todos y gracias de antemano por vuestra ayuda.
Me toca preguntar, esto ya me tiene loco, a ver que podeis hacer por mi.
Tengo que realizar una consulta a varias tablas a un campo en comun, NumRecibo.
Lo que hago es:
Primero Hago la consulta a las tablas asi:
Código Delphi [-]
OrdenCompra.Active := False;
   OrdenCompra.SQL.Text := 'Select OrdenCompra From OrdenProd WHERE OrdenCompra ='+QuotedStr(Edit7.Text);
   OrdenCompra.Active := True;
   ReciboOrden.Active := False;
   ReciboOrden.SQL.Text := 'Select NumRecibo From OrdenProd WHERE NumRecibo ='+Edit10.Text;
   ReciboOrden.Active := True;
   BN.Active := False;
   BN.SQL.Text := 'Select NumRecibo From BancoNac WHERE NumRecibo ='+Edit10.Text;
   BN.Active := True;
   BSJC.Active := False;
   BSJC.SQL.Text := 'Select NumRecibo From BancoSanJoseco WHERE NumRecibo ='+Edit10.Text;
   BSJC.Active := True;
   BSJD.Active := False;
   BSJD.SQL.Text := 'Select NumRecibo From BancoSanJosedol WHERE NumRecibo ='+Edit10.Text;
   BSJD.Active := True;
Verifico que la orden y el numero de recibo no esten repetidos en la tabla ordenes (esto lo hace bien) .
Luego reviso las tablas de los bancos para ver en que banco esta el recibo, (esto lo hace bien.)
Ahora reviso y comparo asi:
Código Delphi [-]
If Edit7.Text = '' then    Edit7.Text:= Edit2.Text    else    If Edit10.Text = ReciboOrden.Fields[0].AsString then    MessageDlg('Este recibo ya se uso en otra orden',mtError,[mbOK],0)
   else    If Edit7.Text = OrdenCompra.Fields[0].Value then    MessageDlg('La orden de Compra ya Existe',mtError,[mbOK],0)
   else    If Edit9.Text = 'Contado' then    begin        If Edit10.Text = BN.Fields[0].AsString then        begin        ShowMessage('esta en el banco nacional');
       end;
       If Edit10.Text = BSJC.Fields[0].AsString then        begin        ShowMessage('esta en el banco San Jose Colones');
       end;
       If Edit10.Text = BSJD.Fields[0].AsString then        begin        ShowMessage('esta en el banco San Jose dolares');
       end    else    MessageDlg('El recibo no esta en ningun banco, REVISE',mtError,[mbOK],0)
   end    else


Y luego grabo los datos si cumple con la condicion asi:
Código Delphi [-]MessageDlg('El recibo no esta en ningun banco, REVISE',mtError,[mbOK],0)
   end    else    If Edit3.Text = '' then MessageDlg('Debe especificar el código del cliente',mtError,[mbOK],0)
   else     begin       ShortDateFormat := 'dd/mm/yyyy';
      DataModule1.AC1.BeginTrans;
      try          If Nueva then          QTemp.SQL.Text := 'Insert Into OrdenProd (Codorden, FechaInicio, FechaRequerido, CodUsuario, Comentarios, CodCliente, Prioridad, Enrutada, OrdenCompra, NumRecibo) '+
                           'Values (' +Edit2.Text+', '+QuotedStr(Edit4.Text)+', '+QuotedStr(DateToStr(DateTimePicker1.DateTime))+', '+
                            QuotedStr(Edit5.Text)+', '+QuotedStr(Memo1.Text)+', '+Edit3.Text+', '+IntEdit1.Text+', True, '+QuotedStr(Edit7.Text)+', '+QuotedStr(Edit10.Text)+')'          else          QTemp.SQL.Text := 'Update OrdenProd set FechaRequerido = '+QuotedStr(DateToStr(DateTimePicker1.DateTime))+', Comentarios = '                             +QuotedStr(Memo1.Text)+', CodCliente = '+Edit3.Text+', Prioridad = '+IntEdit1.Text+
                            ' Where CodOrden = '+Edit2.Text;

         QTemp.ExecSQL;
         guardada := true;
         IF Nueva  then          begin             QOrdProd.Requery();             QOrdProd.Last;          end          else begin                 bok := QOrdProd.Bookmark;                 QOrdProd.Requery();                 QOrdProd.Bookmark := bok;               end;
         DataModule1.AC1.CommitTrans;
         If Nueva then If MessageDlg('Orden Guardada.'+#13+'¿Desea agregar items a la orden?',mtConfirmation,[mbYes,mbNo],0) = mrYes then          Nueva := False;          QOrdProd.Close;          QOrdProd.Open;          TabSheet3.Show;       except          on E:Exception do DataModule1.AC1.RollbackTrans;
      end;//try
   end;
end;
Si juntan todo el codigo, hace un solo evento en un boton.
Bueno el asunto es que no me funciona.
encuentra el recibo, pero si esta no continua la ejecucion, se para ahi, si no lo encuentra si lo graba.
Hay que tener en cuenta que tiene que cumplir una condicion adicional, que el cliente sea de Contado, en esta seccion es donde me da los problemas.
Por favor ayudais al novato:)
Saludos

Caral 15-10-2007 19:02:01

Hola
No se por que no se ve bien
Código Delphi [-]
procedure TFOrdProd.BitBtn1Click(Sender: TObject);
var bok : TBookMarkStr;
begin
   OrdenCompra.Active := False;
   OrdenCompra.SQL.Text := 'Select OrdenCompra From OrdenProd WHERE OrdenCompra ='+QuotedStr(Edit7.Text);
   OrdenCompra.Active := True;
   ReciboOrden.Active := False;
   ReciboOrden.SQL.Text := 'Select NumRecibo From OrdenProd WHERE NumRecibo ='+Edit10.Text;
   ReciboOrden.Active := True;
   BN.Active := False;
   BN.SQL.Text := 'Select NumRecibo From BancoNac WHERE NumRecibo ='+Edit10.Text;
   BN.Active := True;
   BSJC.Active := False;
   BSJC.SQL.Text := 'Select NumRecibo From BancoSanJoseco WHERE NumRecibo ='+Edit10.Text;
   BSJC.Active := True;
   BSJD.Active := False;
   BSJD.SQL.Text := 'Select NumRecibo From BancoSanJosedol WHERE NumRecibo ='+Edit10.Text;
   BSJD.Active := True;
   If Edit7.Text = '' then
   Edit7.Text:= Edit2.Text
   else
   If Edit10.Text = ReciboOrden.Fields[0].AsString then
   MessageDlg('Este recibo ya se uso en otra orden',mtError,[mbOK],0)
   else
   If Edit7.Text = OrdenCompra.Fields[0].Value then
   MessageDlg('La orden de Compra ya Existe',mtError,[mbOK],0)
   else
   If Edit9.Text = 'Contado' then
   begin
       If Edit10.Text = BN.Fields[0].AsString then
       begin
       ShowMessage('esta en el banco nacional');
       end;
       If Edit10.Text = BSJC.Fields[0].AsString then
       begin
       ShowMessage('esta en el banco San Jose Colones');
       end;
       If Edit10.Text = BSJD.Fields[0].AsString then
       begin
       ShowMessage('esta en el banco San Jose dolares');
       end
   else
   MessageDlg('El recibo no esta en ningun banco, REVISE',mtError,[mbOK],0)
   end
   else
   If Edit3.Text = '' then MessageDlg('Debe especificar el código del cliente',mtError,[mbOK],0)
   else

   begin
      ShortDateFormat := 'dd/mm/yyyy';
      DataModule1.AC1.BeginTrans;
      try
         If Nueva then
         QTemp.SQL.Text := 'Insert Into OrdenProd (Codorden, FechaInicio, FechaRequerido, CodUsuario, Comentarios, CodCliente, Prioridad, Enrutada, OrdenCompra, NumRecibo) '+
                           'Values (' +Edit2.Text+', '+QuotedStr(Edit4.Text)+', '+QuotedStr(DateToStr(DateTimePicker1.DateTime))+', '+
                            QuotedStr(Edit5.Text)+', '+QuotedStr(Memo1.Text)+', '+Edit3.Text+', '+IntEdit1.Text+', True, '+QuotedStr(Edit7.Text)+', '+QuotedStr(Edit10.Text)+')'
         else
         QTemp.SQL.Text := 'Update OrdenProd set FechaRequerido = '+QuotedStr(DateToStr(DateTimePicker1.DateTime))+', Comentarios = '
                            +QuotedStr(Memo1.Text)+', CodCliente = '+Edit3.Text+', Prioridad = '+IntEdit1.Text+
                            ' Where CodOrden = '+Edit2.Text;

         QTemp.ExecSQL;
         guardada := true;
         IF Nueva  then
         begin
            QOrdProd.Requery();
            QOrdProd.Last;
         end
         else begin
                bok := QOrdProd.Bookmark;
                QOrdProd.Requery();
                QOrdProd.Bookmark := bok;
              end;
         DataModule1.AC1.CommitTrans;
         If Nueva then If MessageDlg('Orden Guardada.'+#13+'¿Desea agregar items a la orden?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
         Nueva := False;
         QOrdProd.Close;
         QOrdProd.Open;
         TabSheet3.Show;
      except
         on E:Exception do DataModule1.AC1.RollbackTrans;
      end;//try
   end;
end;
Saludos

Delphius 15-10-2007 20:03:13

Hola Caral,

Todavía no he probado el código... me cuesta seguirlo (a vista) el código... lo tendría que probar para ver donde está el fallo.

Me preguntaba si es posible conocer un poco la estructura de la base de datos y como haz hecho las uniones de los datasource, dataset y querys.

Cualquier otra info que tu consideres que pueda ser de utilidad también es bien recibida.
Quisiera tratar de reproducir tus pasos, puede que logre ver el problema.

Saludos,

betiitooo 15-10-2007 20:29:03

Hola, sería bueno que especificaras un poquito ¿que es exactamente lo que quieres hacer con tanta condición y/o mensajes que has colodado?, no me lo tomes a mal, es solo para intentar ayudarte ok, bye

Caral 16-10-2007 00:39:27

Hola
A ver si lo entienden mejor
1- 5 tablas, cuatro en uso un a consulta.
2- tabla ordenprod, esta revisa si la orden esta repetida.
Código Delphi [-]
OrdenCompra.Active := False;
   OrdenCompra.SQL.Text := 'Select OrdenCompra From OrdenProd WHERE OrdenCompra ='+QuotedStr(Edit7.Text);
   OrdenCompra.Active := True;
3- hace una comparacion con un edit y envia un mensaje
Código Delphi [-]
 If Edit7.Text = OrdenCompra.Fields[0].Value then
   MessageDlg('La orden de Compra ya Existe',mtError,[mbOK],0)
4- revisa si el numero de recibo esta en la tabla ordenprod
Código Delphi [-]
ReciboOrden.Active := False;
   ReciboOrden.SQL.Text := 'Select NumRecibo From OrdenProd WHERE NumRecibo ='+Edit10.Text;
   ReciboOrden.Active := True;
5-hace una comparacion u envia un mensaje
Código Delphi [-]
If Edit10.Text = ReciboOrden.Fields[0].AsString then
   MessageDlg('Este recibo ya se uso en otra orden',mtError,[mbOK],0)
6- verifica las tablas de los bancos
Código Delphi [-]
BN.Active := False;
   BN.SQL.Text := 'Select NumRecibo From BancoNac WHERE NumRecibo ='+Edit10.Text;
   BN.Active := True;
   BSJC.Active := False;
   BSJC.SQL.Text := 'Select NumRecibo From BancoSanJoseco WHERE NumRecibo ='+Edit10.Text;
   BSJC.Active := True;
   BSJD.Active := False;
   BSJD.SQL.Text := 'Select NumRecibo From BancoSanJosedol WHERE NumRecibo ='+Edit10.Text;
   BSJD.Active := True;
7- indica una condicion, si es de contado entonces revisa los bancos de lo contrario, sigue.
Aqui es donde esta el asunto, si es de contado y no esta en los bancos entonces envia un mensaje.
Código Delphi [-]
If Edit9.Text = 'Contado' then
   begin
       If Edit10.Text = BN.Fields[0].AsString then
       begin
       ShowMessage('esta en el banco nacional');
       end;
       If Edit10.Text = BSJC.Fields[0].AsString then
       begin
       ShowMessage('esta en el banco San Jose Colones');
       end;
       If Edit10.Text = BSJD.Fields[0].AsString then
       begin
       ShowMessage('esta en el banco San Jose dolares');
       end
   else
   MessageDlg('El recibo no esta en ningun banco, REVISE',mtError,[mbOK],0)
   end
Lo demas sirve, asi que ni para que lo enseño de nuevo.
Espero se entienda ahora, tratare de explicarme mejor la proxima vez.
Saludos

egostar 16-10-2007 01:12:43

Vamos a ver amigo Carlos,

Cita:

Empezado por Caral
7- indica una condicion, si es de contado entonces revisa los bancos de lo contrario, sigue.

Aqui es donde esta el asunto, si es de contado y no esta en los bancos entonces envia un mensaje.

Pero no dices cual es el problema, pero de entrada te puedo decir que en esa porción de código debes de hacer if anidados porque según tu código, solo si es San Jose dolares te funciona como quieres, pero en las otras dos opciones te manda tambien el segundo mensaje 'El recibo no esta en ningun banco, REVISE'.

Checalo así.

Código Delphi [-]
  if Edit9.Text = 'Contado' then begin
     if Edit10.Text = BN.Fields[0].AsString then begin
        ShowMessage('esta en el banco nacional');
     end
     else If Edit10.Text = BSJC.Fields[0].AsString then begin
             ShowMessage('esta en el banco San Jose Colones');
     end
     else if Edit10.Text = BSJD.Fields[0].AsString then begin
             ShowMessage('esta en el banco San Jose dolares');
     end
     else MessageDlg('El recibo no esta en ningun banco, REVISE',mtError,[mbOK],0);
   end

Salud OS

Caral 16-10-2007 20:37:33

Hola
Gracias por vuestra ayuda, ya lo he solucionado, lo cambie a otro evento y muchos parámetros, lo importante es que gracias a vuestra ayuda me guié en una solución mas simple.
Saludos

egostar 17-10-2007 02:34:03

Hola amigo Carlos,

Me parece muy bien que ya hayas focalizado y solucionado el problema, pero.....:rolleyes:, podrías mostrarnos donde "quedó la bolita" :D:D.

Salud OS.


La franja horaria es GMT +2. Ahora son las 21:05:28.

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