Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
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 26-06-2007
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 22
Deiv Va por buen camino
Wink

El código:
Código Delphi [-]
type
  MiArray = array[0..3] of string;
var
  i,j,x:  integer;
  A:MiArray;
  B: TStringList;
begin
  B:= TStringList.Create;
  x:=0;
  ........
  with ADOQuery1 do
    begin
       first;
       while not eof do
         begin
            if (B.IndexOf(FieldByName('Tipo').AsString)=-1) then
                begin
                  A[x]:= FieldByName('Tipo').Value;
                  inc(x);
                end;
            next;
         end;
    end;
...
end;

Me lanza error en la línea:
if (B.IndexOf(FieldByName('Tipo').AsString)=-1) then
Project raised exception class EAccess Violation

Imagino que es porque no está lleno el TStringList, es decir imagino que no use el método ADD, ¿alguna orientación, de cómo corregirlo?
Responder Con Cita
  #2  
Antiguo 26-06-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 28
eduarcol Va por buen camino
Bueno yo no creo que es por lo lleno en caso de que no este lleno el error que te daria es index out of bound pero el acces violation es sobre un control que no esta creado en memoria, por los momentos no veo el error, seguro qe la copia es exacta del programa???
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #3  
Antiguo 26-06-2007
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 22
Deiv Va por buen camino
Exclamation

Si es copia exacta,
Solo que tiene otras cosas más (.......) ya que el objetivo es capturar aquellos 4 elementos (Metal, No Metal, Anfótero y Gas Noble) para los Títulos de una Barra OutLook de TMS, he ahí que me interesa filtrar SIN REPETICIÓN y guardarlo en un ARRAY, para luego recuperarlo por código en dicha barra a manera de títulos.

Última edición por Deiv fecha: 26-06-2007 a las 16:13:51.
Responder Con Cita
  #4  
Antiguo 26-06-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 28
eduarcol Va por buen camino
No entiendo porq tantas cosas en el programa, yo lo haria con esta modificacion

Código Delphi [-]
type
  MiArray = array[0..3] of string;
var
  i,j,x:  integer;
  A:MiArray;
begin
  x:=0;
  ........
  with ADOQuery1 do
    begin
       first;
       while not eof do
         begin
            A[x]:= FieldByName('Tipo').Value;
            inc(x);
            next;
         end;
    end;
...
end;

Si lo que quieres es agregar el resultado de la consulta al arreglo con eso bastara no tienes necesdiad del stringlist
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #5  
Antiguo 26-06-2007
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 22
Deiv Va por buen camino
Wink

Hola, gracias por la respuesta, pero
Cita:
Empezado por eduarcol
No entiendo porq tantas cosas en el programa
mira que en este momento no tengo Delphi a mano, por ello no sé si va a funcionar tu sugerencia.
A vista (tal vez este equivocado como novato) el codigo trabajará recuperando toda la columna y todos los registros de "Tipo", sin embargo mi objetivo era que filtre sin repetir los mismos para los títulos de la Barra OutLook, así como en un principio planteé, pues si te das cuenta en:
Código:
Nombre         Tipo
Litio              Metal
Oxígeno         No Metal
Sodio            Metal
Manganeso    Anfótero
Cloro            No Metal
Calcio           Metal
Molibdeno      Anfótero
Helio             Gas Noble
...... etc, etc, etc, etc.

En "Tipo" existen muchos elementos que se repiten y Yo solo quiero rescatar aquellos 4; redundo: Metal, No Metal, Anfótero y Gas Noble.
Por ello tomé el ejemplo del ComboBox que este con su IndexOf y el -1 capturaba elementos sin repetirlos:
Código Delphi [-]
      if (ComboBox1.Items.IndexOf(FieldByName('Tipo').AsString)=-1) then  //en caso que existan registros iguales solo cargaría uno
                        begin
                           ComboBox1.Items.Add(FieldByName('Tipo').AsString);
                           A[x]:=FieldByName('Tipo').AsString;
                           inc(x);
                        end;
¿Alguna sugerencia?

Última edición por Deiv fecha: 26-06-2007 a las 19:43:54.
Responder Con Cita
  #6  
Antiguo 26-06-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Me parece que el fallo es de filosofía....

Se quiere seleccionar solo 4 Tipos, pero conocidos de antemano . ¿qué sentido tiene buscar esos 4 tipos en la base de datos si ya son conocidos?

Lo suyo creo es lo siguiente:
En las preferencias del programa indicas: " Tipos que se verán en el Outlook" y muestras al usuario un CheckListBox con todos los tipos existentes en la base de datos.

El usuario marca la casilla de verificación y esa selección se guarda en una tabla especial de tu programa llamada "Config".

De esta forma permites al usuario que ponga las categorías que le venga en gana en el Outlook.

Si ves que es mucho lío, usa solo la tabla "Config":
Código:
codigo                     Valor
OutlooksItems                Gas Noble, Metal, No Metal
Preferencia1                lo que sea...
Preferencia2                lo dicho.
Te encargas tú por código grabar esa opción.

Otra forma de grabarlo:
Código:
codigo                     Valor
OutlookItem1                Gas Noble
OutlookItem2                Metal
OutlookItem3                No Metal
Preferencia1                lo que sea...
Preferencia2                lo dicho.
Si esos 4 tipos son inamovibles y cambiarán jamás, entonces añadelo en tiempo de diseño cuando cargas el Outlook con sus elementos.

El tema de solicitar una lista sin repetidos, es tan fácil como un Query, con su propiedad SQL definida a :
Código SQL [-]
select distinct Tipo from Tabla_Elementos
order by Tipo

Decide primero cómo quieres hacerlo y después vendrá el código fuente . Explicar detalladamente lo que quieres obtener, también nos sirve de ayuda.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 26-06-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
Estuve pensando ¿para que estar liandose tanto por una consulta o recorrido que SE SABE DE ANTEMANO QUE SIEMPRE ARROJARÁ LOS MISMOS RESULTADOS?

Si es realmente que sólo existen estas 4 condiciones y ninguna más. ¿Porque no simplemente se mantiene un array declarado en forma fija?

Código Delphi [-]
const
ARRAY_ELEMENTOS : TArray4elemtos = ('Metal', 'No Metal', 'Anfótero',  'Gas Noble');

// siendo

type
TArray4elemtos: array[0..3] of string;

Si estoy confundido haganme saber.
EDITO: acabo de ver que Lepe también se había dado cuenta.
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 26-06-2007 a las 20:26:53.
Responder Con Cita
  #8  
Antiguo 27-06-2007
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 22
Deiv Va por buen camino
Unhappy

Gracias por las respuestas, estoy muy liado en esto
Encontré el error del post #5, y es que mi array tenía el tamaño [0..3]. Cuando le puse [0..100] arranca normal, pero para comprobar si llenaba bien el Array modifiqué un poquitín el código por:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
type
  UnArray = array[0..100] of string;
var
  i,j,x:  integer;
  A:UnArray;
  B:TStringList;
const
  sqlElementos = ' Select * from elementos ';
begin
  x:=0;
  B:= TStringList.Create;
  ADOQuery1.Active:= False;
  ADOQuery1.Sql.text:= sqlElementos;
  ADOQuery1.Active:= True;
  with ADOQuery1 do
    begin
      first;
      while not eof do
        if (B.IndexOf(FieldByName('Tipo').AsString)=-1) then
           begin
              ComboBox2.Items.Add(FieldByName('Tipo').AsString);//Agregué un Combo
              A[x]:= FieldByName('Tipo').Value;
              inc(x);
              next;
           end;
    end;
end;

Y desplegando el ComboBox2 NO me filtra nada de nuevo, me llena TODOS los Registros de esa columna, he ahi donde se explica el error que me lanzaba Delphi, pues dicha línea no me filtraba y sobrepasaba la capacidad del Array; Pregunta:
¿Por qué la línea:
Código Delphi [-]
if (B.IndexOf(FieldByName('Tipo').AsString)= -1) then
NO TRABAJA IGUAL QUE:
Código Delphi [-]
if (ComboBox1.Items.IndexOf(FieldByName('Tipo').AsString)= -1) then
que con -1 suprime los valores repetidos???

Cita:
Empezado por eduarcol
Si lo que quieres es agregar el resultado de la consulta al arreglo con eso bastara no tienes necesdiad del stringlist
No sé cómo se podría realizar un tipo de consulta de manera que me filtre valores sin repetir, pues por ejemplo los códigos:
Código Delphi [-]
ADOQuery1.Sql.text := sqlElementos + ' where Tipo = "Metal"';
ó
Código Delphi [-]
ADOQuery1.Sql.text := sqlElementos + ' where Tipo = "Anfotero"';
Estas Consultas lo único que me muestran son varios campos "Metal" repetidos, contando todos los que existen en la BD o en el otro caso muchos "Anfótero" y obviamente al lado los otros campos que si son diferentes, pero a mi solo me interesa capturar TODOS LOS NO REPETIDOS de la Columna "Tipo". Di un ejemplo con 4 (solo fue un ejemplo) pero si fueran 300, ahí cambia la cosa verdad?
Por ello estoy trancado en la línea:
Código Delphi [-]
if (B.IndexOf(FieldByName('Tipo').AsString)= -1) then

He decidido mejor adjuntar los ejemplos para que os puedas revisaros.
¿Alguna otra sugerencia, por favor?
Archivos Adjuntos
Tipo de Archivo: zip Elementos.zip (13,0 KB, 8 visitas)
Tipo de Archivo: zip No Funciona.zip (8,6 KB, 8 visitas)

Última edición por Deiv fecha: 26-08-2007 a las 01:53:53.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Guardar y Filtrar en una Tabla Sr.Scorpion Conexión con bases de datos 19 23-03-2007 18:14:44
Guardar/Recuperar OLEVARIANT OF ARRAY (II) Franz Argandoña Tablas planas 2 13-07-2006 21:42:59
Guardar array en tabla StartKill Firebird e Interbase 4 13-07-2004 15:18:50
Guardar Olvariant of Array en Access Franz Argandoña Tablas planas 1 01-05-2004 03:54:52
Como guardar una array en una base datos? ciscu Varios 3 11-02-2004 10:27:49


La franja horaria es GMT +2. Ahora son las 20:03:56.


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