Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-09-2005
Avatar de papulo
papulo papulo is offline
Miembro
 
Registrado: Aug 2005
Ubicación: Lleida - Cataluña - España -Europa - Planeta tierra - Sistema solar - Via Lactea ...
Posts: 542
Poder: 13
papulo Va por buen camino
Talking *.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?
Responder Con Cita
  #2  
Antiguo 19-09-2005
afxe afxe is offline
Miembro
 
Registrado: Jul 2004
Ubicación: Malaga-España
Posts: 206
Poder: 15
afxe Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 19-09-2005
afxe afxe is offline
Miembro
 
Registrado: Jul 2004
Ubicación: Malaga-España
Posts: 206
Poder: 15
afxe Va por buen camino
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;
Responder Con Cita
  #4  
Antiguo 19-09-2005
Avatar de FunBit
FunBit FunBit is offline
Miembro
 
Registrado: Jun 2005
Ubicación: Santa Maria d'Oló
Posts: 572
Poder: 14
FunBit Va por buen camino
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!!
__________________
Brot Psicòtik
Responder Con Cita
  #5  
Antiguo 19-09-2005
Avatar de papulo
papulo papulo is offline
Miembro
 
Registrado: Aug 2005
Ubicación: Lleida - Cataluña - España -Europa - Planeta tierra - Sistema solar - Via Lactea ...
Posts: 542
Poder: 13
papulo Va por buen camino
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)
Responder Con Cita
  #6  
Antiguo 19-09-2005
Avatar de FunBit
FunBit FunBit is offline
Miembro
 
Registrado: Jun 2005
Ubicación: Santa Maria d'Oló
Posts: 572
Poder: 14
FunBit Va por buen camino
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!
__________________
Brot Psicòtik
Responder Con Cita
  #7  
Antiguo 19-09-2005
Avatar de papulo
papulo papulo is offline
Miembro
 
Registrado: Aug 2005
Ubicación: Lleida - Cataluña - España -Europa - Planeta tierra - Sistema solar - Via Lactea ...
Posts: 542
Poder: 13
papulo Va por buen camino
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.

Última edición por papulo fecha: 19-09-2005 a las 12:53:09. Razón: Matizando
Responder Con Cita
  #8  
Antiguo 19-09-2005
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: Sep 2004
Ubicación: Medellín - Colombia
Posts: 3.492
Poder: 18
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
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
__________________
Nuevo Blog.
Ahora en Twitter!.
Responder Con Cita
  #9  
Antiguo 19-09-2005
Avatar de papulo
papulo papulo is offline
Miembro
 
Registrado: Aug 2005
Ubicación: Lleida - Cataluña - España -Europa - Planeta tierra - Sistema solar - Via Lactea ...
Posts: 542
Poder: 13
papulo Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 15:14:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi