Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Ayuda en If Then Else (https://www.clubdelphi.com/foros/showthread.php?t=65063)

ekbadel 18-11-2009 03:08:57

Ayuda en If Then Else
 
Hola estimados Compañeros bien les planteo el Siguiente Problema tengo una Consulta lanzada a la Bd de la Tabla de Pagos Bien lo siguiente es cuando hago la comparacion de Resultados:
Código Delphi [-]
 
If (qryPagosIdTipPag2.Value = 1)  Then
                qrPro0.memReportePagos.Value   := StrToFloat(lo_s)
            else If (qryPagosIdTipPag2.Value = 2)  Then
                     qrPro0.memReportePagos2.Value   := StrToFloat(lo_s)
            else If (qryPagosIdTipPag2.Value = 3)  Then
                     qrPro0.memReportePagos3.Value   := StrToFloat(lo_s)
            else If (qryPagosIdTipPag2.Value = 4)  Then
                     qrPro0.memReportePagos4.Value   := StrToFloat(lo_s)
            else If (qryPagosIdTipPag2.Value = 5)  Then
                     qrPro0.memReporteServFac.Value  := StrToFloat(lo_s);
            end;
            qrPro0.memReporte.Post;
Bien el problema es que que el Resultado idTipPag viene siendo cualquiera de los 5 a la misma vez y eso me manda por default al Ultimo resultado en dado caso que exista mas de un tipo de pago del Cliente.

Mi pregunta es Puedo hacer un And de resultado

(sdQuery.Value = 1 and sqQuery = 2 ad..........)

Se puede o alguna recomendacion de como Hacerlo Gracias..

calogero 18-11-2009 07:44:26

Hola, una variable no puede tomar dos valores al mismo tiempo

ejemplo:


Código:

...
  var
    indice: integer;
  begin
    if (indice = 1) and (indice = 2) then  // ---- imposible de evaluar
      showmessage('indice vale 1 y tambièn vale 2');
  end...

creo que la forma en la que tienes tu codigo es correcta, y si te funciona no veo cual sea el problema.

JosepGA 18-11-2009 09:29:56

hola,

pienso como Calogero, si te hemos entendido bien, por que si nom ¿ Te refieres a la evaluación de los IF o te refieres a la asignación de valores ? Ya que el tema de AND u OR es para comparaciones, es decir, en tu caso:

Código Delphi [-]
If ( (qryPagosIdTipPag2.Value = 1) Or (qryPagosIdTipPag2.Value = 2) ) Then
                   qrPro0.memReportePagos.Value   := StrToFloat(lo_s)
else If (qryPagosIdTipPag2.Value = 3)  Then
  qrPro0.memReportePagos3.Value   := StrToFloat(lo_s)
            else If (qryPagosIdTipPag2.Value = 4)  Then
  qrPro0.memReportePagos4.Value   := StrToFloat(lo_s)
            else If (qryPagosIdTipPag2.Value = 5)  Then
  qrPro0.memReporteServFac.Value  := StrToFloat(lo_s);

end;  ¿ ESTE END SOBRA ?
            
qrPro0.memReporte.Post;

Un saludo

gerardus 18-11-2009 10:17:04

Seria más elegante y más claro:


Código:

var   
  i: integer; 
begin 
i :=  qryPagosIdTipPag2.Value ;
case i of   
  1: qrPro0.memReportePagos.Value  := StrToFloat(lo_s);   
  2: qrPro0.memReportePagos2.Value  := StrToFloat(lo_s)
  3: qrPro0.memReportePagos3.Value  := StrToFloat(lo_s)
  4: qrPro0.memReportePagos4.Value  := StrToFloat(lo_s)
  5: qrPro0.memReporteServFac.Value  := StrToFloat(lo_s);
end; //case 
qrPro0.memReporte.Post;qrPro0.memReporte.Post;

Si el valor 1 y2 dan el mismo resultado, sería:

Código:

var   
  i: integer; 
begin 
i :=  qryPagosIdTipPag2.Value ;
case i of   
  1,2: qrPro0.memReportePagos.Value  := StrToFloat(lo_s);   
  3: qrPro0.memReportePagos3.Value  := StrToFloat(lo_s)
  4: qrPro0.memReportePagos4.Value  := StrToFloat(lo_s)
  5: qrPro0.memReporteServFac.Value  := StrToFloat(lo_s);
end; //case 
qrPro0.memReporte.Post;qrPro0.memReporte.Post;

Y como bien dice JosepGA te sobra un end

Saludos,

Gerard.

Ñuño Martínez 18-11-2009 11:32:37

A ver si lo he entendido:

Lo que pretendes es que "qryPagosIdTipPag2.Value" sea capaz de contener más de un valor al mismo tiempo, ¿no?

Pues si es sí, entonces entonces tienes que usar SET OF o bien campos de bit. Elegir una u otra opción depende de dónde obtienes el contenido de "qryPagosIdTipPag2.Value", aunque por el nombre supondré que es de una consulta SQL. Si es el caso te recomiendo el uso de campos de bit.

Los campos de bit, como el nombre indica, son estructuras en los que cada campo ocupa un sólo bit, por lo que permite almacenar valores binarios. Por ejemplo:

Código Delphi [-]
TYPE
    TCampoDeBit: BYTE; (* Permite hasta ocho campos. *)
CONST
    cdbUNO    = $01; { 00000001 }
    cdbDOS    = $02; { 00000010 }
    cdbTRES   = $04; { 00000100 }
    cdbCUATRO = $08; { 00001000 }
    cdbCINCO  = $10; { 00010000 }
    cdbSEIS   = $20; { 00100000 }
    cdbSIETE  = $40; { 01000000 }
    cdbOCHO   = $80; { 10000000 }
VAR
   Valor: TCampoDeBit;
BEGIN
{ Asignar 1 a un campo: }
    Valor := Valor OR cdbTRES;
{ Asignar 0 a un campo: }
   Valor := Valor AND (NOT cdbSIETE);
{ Comprobar si un campo es 1: }
   IF (Valor AND cdbCINCO) <> 0 THEN
      ...
{ Comprobar si más de un campo es uno: }
   IF (Valor AND (cdbUNO OR cdbDOS)) <> 0 THEN
      ...
END:

Si no lo entiendes, busca información sobre matemáticas binarias. ;)

ekbadel 18-11-2009 13:30:32

If Then Else
 
Hola Primero que nada Agradezco de antemano las respuestas de todos y espero haber comprendido correctamente cada una de sus respuestas bn aqui voy a explicarme un poco mas tellado:

Codigo
Código Delphi [-]
 
   if loFirst then begin
               qryPagos.Filter := 'Folio = '+IntToStr(qryReporteFolio.Value)+' AND Cancelado = '+chr(39)+'False'+chr(39);
               qryPagos.First;
               lo_s := '';
               While not qryPagos.Eof do begin
                  if lo_s = '  ' then
                     lo_s := FloatToStr(qryPagosImporte.Value) <---- Primero
                  
 
             else
                     lo_s := lo_s+FloatToStr(qryPagosImporte.Value);
                  qryPagos.Next;
              end;
Bien de este codigo apartir de una sentencia Sql parto en Busqueda de un resultado en el reglon donde apunto <-------Primero verifico que la caden obtenida de mi query sea un solo resultado y en la segunda verifico si lo_s tiene mas de un resultado me lo envie, bn comprendido como Mencionan antes he sacado por medio de resultados Todos correctos siempre y cuando el resultado arroje que siempre tien 1 solo tipo de pago

cliente 80
importe paga 200
forma pago 1

cliente 90
importe paga 80
forma pago 3
.
.
.Cosecutivamente habiendo 1 sola exibicion genial !!


Bien el problema persiste cuando el cliente tiene mas de dos pagos es decir

lo_s := lo_s+FloatToStr(qryPagosImporte.Value);

En esta parte digamos que el Cliente

120
Importe 100 y 200
tipopago 1 y 3

En esta parte al hacer las validaciones de la forma de pago me tira el resultado en el Ultimo.

qryTipoPago.Value = 3 Then
resutaldo = lo_s;

a lo que lo_s. arroja 100200, cuando deberian ir separados
He ahi mi gran Problema..

Espero haberme dado a entender al 100%

cloayza 18-11-2009 14:56:15

Intentando interpretar tu codigo...Con algunas modificaciones...

Código Delphi [-]
if loFirst then begin
   qryPagos.Filter := Format('Folio = %d AND Cancelado=%s',[qryReporteFolio.Value, QuotedStr('False')]);
   qryPagos.First;
   lo_s := '';
   While not qryPagos.Eof do begin

   {      if lo_s = ' ' then
            lo_s := FloatToStr(qryPagosImporte.Value) <---- Primero


         else
            //Para que concatenar los Importes...?
            lo_s := lo_s+FloatToStr(qryPagosImporte.Value);
   }
         ...
         //qrPro0.memReporte.Insert
         //qrPro0.memReporte.Edit;

         Case (qryPagosIdTipPag2.Value) Of
              1: qrPro0.memReportePagos.Value  := qryPagosImporte.Value
              2: qrPro0.memReportePagos2.Value := qryPagosImporte.Value
              3: qrPro0.memReportePagos3.Value := qryPagosImporte.Value
              4: qrPro0.memReportePagos4.Value := qryPagosImporte.Value
              5  qrPro0.memReporteServFac.Value:= qryPagosImporte.Value
         end;

         qrPro0.memReporte.Post;

         qryPagos.Next;
   end;

Ojala sea la lectura correcta...

ekbadel 18-11-2009 15:35:20

If Then Else
 
Hola: Cloyza, Muchas gracias por tus Contestaciones

Me sirvio de algo para agilizar y dejarlo mas Optimizado
Respecto al comentario de la concatenacion estas en lo correcto
por cuestiones anteriores se diseño de la siguiente manera

Pagos si es de una sola expedicion

NombrePago $Importe

Si eran mas de una expedicion

NombrePago $Importe , NombrePago $Importe

He aqui donde realizaba la concatenacion

Ahora se pide de la siguiente mane

pago1 pago2 pago3 pago4 pago
100
80

150 50


Apartir de esto es el problema Principal cuando saco mis sentencias If o Case en tu caso me manda a la Ultima Opcion Haciendo la concatenacion tomando el pago4 mayoritario o ultimo por decirlo asi, quisiera saber como hacer para sustraer el valor1 y valor4 separados para asi poder asignarlo a su Lugar indicado.

Gracias...Saludos......

calogero 18-11-2009 21:21:22

Hola en mi opinión no tienes porque concatenar el nombrepago con el importepago,
te seria mas fácil si lo manejaras de la siguiente manera en una tabla en la base de datos:

tabla pagos

idpago | nombrepago | importe
------------------------------
1 | pago1 | $0.00
2 | pago2 | $0.00
3 | pago3 | $0.00
4 | pago4 | $0.00

de esa manera obtienes cada campo por separado y asi lo podrías manipular mejor en tu query

ejemplo

Código:

var
  nombrePago: string;
  importePago: string;
  ...
  nombrePago := qryGral.FieldByName('nombrepago').asString;
  importePago := qryGral.FieldByName('importe').asString;
  ...


ekbadel 18-11-2009 22:31:05

Cita:

Empezado por calogero (Mensaje 346952)
Hola en mi opinión no tienes porque concatenar el nombrepago con el importepago,
te seria mas fácil si lo manejaras de la siguiente manera en una tabla en la base de datos:

tabla pagos

idpago | nombrepago | importe
------------------------------
1 | pago1 | $0.00
2 | pago2 | $0.00
3 | pago3 | $0.00
4 | pago4 | $0.00

de esa manera obtienes cada campo por separado y asi lo podrías manipular mejor en tu query

ejemplo

Código:

var
  nombrePago: string;
  importePago: string;
  ...
  nombrePago := qryGral.FieldByName('nombrepago').asString;
  importePago := qryGral.FieldByName('importe').asString;
  ...




Hola Caloguero cierto lo que dices, desafortundamente mi Table no esta de esa manera la tengo asi:

Id Folio idforpag importe
1 755 1 100
2 755 2 150
3 755 3 200

Todo esta en un EOF y quedo lanzo la query me manda los tres registros es por eso que en su momento los concatone..
Forma Pago,Nombre Pago
y me salia 1 100, 2 150, 3 200

Ahora mi problema es separalos

pago1 pago2 pago3 pago4
100 200 300

pero siempre me da el Ultimo resultado...

Lei por ahi algo de separarlos uno por uno pero no entiendo bn la metodologia podrias Orientarme al respecto


Saludos.......

calogero 19-11-2009 06:19:13

Código Delphi [-]
 
   if loFirst then begin
               qryPagos.Filter := 'Folio = '+IntToStr(qryReporteFolio.Value)+' AND Cancelado = '+chr(39)+'False'+chr(39);
               qryPagos.First;
               lo_s := '';
               While not qryPagos.Eof do begin
                  if lo_s = '  ' then
                     lo_s := FloatToStr(qryPagosImporte.Value) <---- Primero
                  
 
             else
                     lo_s := lo_s+FloatToStr(qryPagosImporte.Value);<--justo aqui
                  qryPagos.Next;
              end;

donde te indico con texto rojo justo ahi no concatenes mejor almacena los resultados en un stringList que viene siendo como un arreglo dinamico, ejemplo;

Código Delphi [-]
var

  StringList: TStrings;
begin

  StringList := TStringList.Create;
  try
      //todo lo encierras en un ciclo el mismo que usas para leer tu query, 
      //con la propiedad count del stringList puedes saber cuantos items o valores contiene
      //aqui alimenta el string list
      StringList.Add(qryPagosImporte.asString);
      StringList.Add('Otro valor más');

    end;

  finally
    StringList.free;
  end;
end;

te mando este link y aqui viene como usar el string list.
http://delphiallimite.blogspot.com/2...inglist-i.html

no se si me hayas captado la idea pero seria como una pila de datos y asi te evitas concatenar y luego desconcatenar
1 |valor1
2 |valor2
3 |valor3
...
n |valorn

y asi vas recorriendo el stringList y tomando valores
espero que te sirva, saludos.


La franja horaria es GMT +2. Ahora son las 16:59: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