Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   *.EoF = mas de una condicion para un solo resultado (https://www.clubdelphi.com/foros/showthread.php?t=25300)

papulo 19-09-2005 09:57:14

*.EoF = mas de una condicion para un solo resultado
 
Código Delphi [-]
 If DataModule2.IBSQL1.FieldByName('ref_type').AsString = ['A','PA'] then
 begin
            StringGrid1.cells[0, i] := 'Alternador';
            i := i+1;
            StringGrid1.RowCount := i;
            end
Quiero hacer algo asi, si es posible. Juntar dos condiciones para un if y que me realicen la misma operacion, dado que no puedo usar case/of porque son strings y en la ayuda me especifica que con ese tipo de variables no funciona.

¿Alguna sugerencia?

afxe 19-09-2005 10:36:04

Se puede usar el operador in si los resultados fueran elementos de un conjunto enumerado, aunque claro, entonces también podrías usar el case. Cuando me encuentro algo así suelo usar el Pos, que me indica si una subacadena se encuentra dentro de una cadena:
Código:

 
 
  if Pos (MiQuery.FieldByName('Mi_Campo'), ' A PA ') > 0 then begin
        Inc(Contador);
  end;

Importante separar los resultados entre espacios para que si el valor del campo es 'APA' no te de un resultado positivo. Cuando te acostumbras en verlo en tu codigo es intuitivo, aunque reconozco que no es una solución elegante.

Saludos.

afxe 19-09-2005 10:37:15

Post Data:

Se me había olvidado el AsString:

Código:

 
if Pos (MiQuery.FieldByName('Mi_Campo').AsString, ' A PA ') > 0 then begin
        Inc(Contador);
end;


FunBit 19-09-2005 11:16:28

Por otra parte ...

Código Delphi [-]
The case statement
 
 case I of
 
   1..5: Caption := 'Low';
   6..9: Caption := 'High';
   0, 10..99: Caption := 'Out of range';
 else
   Caption := '';
 end;
es equivalente a las condiciones anidadas...

Código Delphi [-]
 if I in [1..5] then
 
   Caption := 'Low'
   else if I in [6..10] then
     Caption := 'High'
     else if (I = 0) or (I in [10..99]) then
       Caption := 'Out of range'
       else
         Caption := '';

Saludos!!

papulo 19-09-2005 12:32:13

No comprendo bien como funciona lo que me explicas, pero sere mas claro con mi problema.

Yo estoy realizando una consulta con IBSQL sobre una BD, cuyos resultados pueden ser 'A', 'PA', 'M', 'PM', 'C' y 'PC'.

La consulta sobre los resultados lo hago secuencial, de principio a fin, con la condicion
Código Delphi [-]
while not EoF
para terminar.
Mi idea es comparar cada resultado de la consulta con los 6 resultados. Ademas, quiero que, si ya ha detectado primero 'A' y ha dibujado la columna correspondiente a 'A' (Alternadores), cuando localice 'PA'(Partes de Alternadores), omita la parte de creacion de la columna, dado que sino, tengo dos veces la columna alternadores. En caso que no exista 'A' pero si 'PA' que me cree la columna predefinida para 'A'.

En caso de que me haya explicado fatal, preguntad que intentare ser mas claro.

PD: La "ayuda" no me ha ayudado demasiado... jejeje. (De buen rollito, Roman)

FunBit 19-09-2005 12:41:54

Código Delphi [-]
while not Eof do begin
  if DataModule2.IBSQL1.FieldByName('ref_type').AsString = 'A' then
    begin
    ... //Acciones que deseas si el caracter obtenido es 'A'
    end else begin
    if  DataModule2.IBSQL1.FieldByName('ref_type').AsString = 'PA' then
      begin
      ...//Acciones que deseas si el caracter obtenido es 'PA'
      end else begin
      ...
 end;
y así succesivamente con las 6 posibles opciones que tienes.

Es eso lo que preguntas?

Un saludo!

papulo 19-09-2005 12:51:03

Cita:

Empezado por FunBit
Código Delphi [-]
while not Eof do begin
    if DataModule2.IBSQL1.FieldByName('ref_type').AsString = 'A' then
      begin
      ... //Acciones que deseas si el caracter obtenido es 'A'
      end else begin
      if  DataModule2.IBSQL1.FieldByName('ref_type').AsString = 'PA' then
        begin
        ...//Acciones que deseas si el caracter obtenido es 'PA'
        end else begin
        ...
   end;
y así succesivamente con las 6 posibles opciones que tienes.

Es eso lo que preguntas?

Un saludo!

Gracias por la resupuesta.

El problema con esa solucion que me planteas, es que si primero me sale 'A', me creara la fila Alternadores y si despues me sale 'PA', me creara otra fila llamada Alternadores cosa que no quiero, dado que 'A' se refiere a la maquina Alternadores y 'PA' se refiere a las piezas que componen un alternador, estan contempladas en la misma fila.

Un posible resultado seria: 'A','PA','M,'PM','C','PC'

y Me tendria que generar solo 3 filas:

Alternadores
M.C.Continua
M.Arranque

Es decir, tanto si me sale una, la otra o las dos, solo habra una fila llamada Alternadores.

Mi unica intencion es intentar encontrar una forma elegante de hacerlo, que usando el if y funciones, mas o menos se por donde tirar, pero con lo novato que soy, a lo mejor hay alguna funcion que me resuelve esto de una manera mas clara.

mamcx 19-09-2005 16:00:12

Diferentes opciones:

1- Por que no lo haces con SQL (la sintaxis puede variar dependiendo del motor)?

Código SQL [-]
 SELECT * FROM TABLA WHERE Campo IN ('A','PA','M,'PM','C','PC')

2- Puedes usar las funciones de RTI de Delphi y utilizar una enumeracion, que haga:

Código Delphi [-]
 type
   TCosasEnum = (Alternadores,PiezasAlternador...) ;
  
  
  uses TypInfo;
 
  var s: string;
 
  s := GetEnumName(TypeInfo(TCosasEnum ),
                    integer(tpDelphi)) ;
  
  //s='Alternadores'
 
 
 
 //Devolver a ENUM
 
 Cosa := TCosasEnum(GetEnumValue(TypeInfo(TCosasEnum ),s)) ;

Puedes crear un objeto, que interno maneje un Array. Me gusta un poco mas esto, porque es mas extensible (y solo si lo del SQL no se puede, aunque lo dudo)

Código Delphi [-]
 
 ObjetoDeCosas.EstaEnTipos(DataModule2.IBSQL1.FieldByName('ref_type').AsString

Ademas, la sintaxis del if se escribe de forma mas clara y sin tantas anidaciones

Código Delphi [-]
 if DataModule2.IBSQL1.FieldByName('ref_type').AsString = 'A' then
begin
  ... //Acciones que deseas si el caracter obtenido es 'A'
end else begin
if  DataModule2.IBSQL1.FieldByName('ref_type').AsString = 'PA' then
begin
   ...//Acciones que deseas si el caracter obtenido es 'PA'
end else begin end;//if

papulo 19-09-2005 16:39:32

La consulta en SQL me ha venido genial, si bien, el problema es que tengo 3 funciones que hacer, 2 condiciones por funcion que las cumplen y una excluye a la otra.

O sea, tanto si sale 'A' como 'PA' se realizara la funcion de Dibujar la fila Alternadores, si bien, si se cumple una, 'A' o 'PA', la otra no.

Por eso las soluciones que me dais no me acban de convencer.

Intentare poner un booleano en la condicion, para que una vez dibujada la fila, si se vuelve a cumplir los requisitos para dibujarla de nuevo, vea que ya lo esta y no la duplique.

Ya posteare la chapuza que me salga.


La franja horaria es GMT +2. Ahora son las 03:50:29.

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