PDA

Ver la Versión Completa : *.EoF = mas de una condicion para un solo resultado


papulo
19-09-2005, 09:57:14
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:


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:


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 ...

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...


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 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
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
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)?


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:


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)



ObjetoDeCosas.EstaEnTipos(DataModule2.IBSQL1.FieldByName('ref_type').AsString


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


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.