Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Identificar parte de un dato dentro de un campo (https://www.clubdelphi.com/foros/showthread.php?t=55090)

Caral 08-04-2008 03:37:40

Identificar parte de un dato dentro de un campo
 
Hola a todos
A ver si me podéis dar una mano con esto.
Tengo una tabla en donde tengo un campo descripción.
En este campo hay por ejemplo varios productos por ejemplo:

LAMINA 187 X 305 BONE
LAMINA 187 X 305 BLANCO

Este campo lo capturo en un combobox en donde me salen todos los que cumplen con una condición (sql).

Lo que me gustaría es:
En el evento onchange del combobox poder identificar la ultima parte.
(BONE) o (BLANCO)

Se podrá.

Este es el codigo con el que lo capturo:
Código Delphi [-]
 QTemp.SQL.Text := 'SELECT Materiales.Descripcion FROM Materiales WHERE Materiales.Notas = "LAMINA"';
   QTemp.Active := True;
   While not QTemp.Eof do
   begin
      CBLamina.Items.Add(QTemp.Fields[0].Text);
      QTemp.Next;
   end;
   QTemp.Active := False;


Saludos

egostar 08-04-2008 03:45:54

Hola amigo,

Creo que hoy estoy cerrado, no entiendo lo que quieres hacer :o

Salud OS

Caral 08-04-2008 03:51:39

Hola
Cita:

Empezado por egostar (Mensaje 278165)
Hola amigo,

Creo que hoy estoy cerrado, no entiendo lo que quieres hacer :o

Salud OS

Pues ya somos dos.:D:D:D
Lo que quiero hacer es identificar parte del texto que contiene ese campo.

Si el campo tiene:
LAMINA 187 X 305 BONE

Tiene:
LAMINA
187
X
305
BONE

Quiero que al mostrar ese campo en el combobox me identifique la ultima parte del campo: BONE

Se podra?':confused:

Estoy cada vez mas espeso, no capto nada.
Saludos

dec 08-04-2008 04:10:08

Hola,

No sé si será muy elegante, ni siquiera si acierto con lo que creo que quieres, pero, vamos, a ver qué tal parece esto:

Código Delphi [-]
function GetLaminaType(rawData: string): string;
var
  i: integer;
begin
  i := Length(rawData);
  while (i >= 0) do begin
    if (rawData[i] = ' ') then
      break;
    result := rawData[i] + result;
    Dec(i);
  end;
end;

// Ejemplo de uso
procedure TForm1.Button1Click(Sender: TObject);
begin

  // Muestra BONE
  ShowMessage(GetLaminaType('LAMINA 187 X 305 BONE'));

  // Muestra BLANCO
  ShowMessage(GetLaminaType('LAMINA 187 X 305 BLANCO'));

end;

egostar 08-04-2008 04:16:34

Cita:

Empezado por Caral (Mensaje 278166)
Hola

Pues ya somos dos.:D:D:D
Lo que quiero hacer es identificar parte del texto que contiene ese campo.

Si el campo tiene:
LAMINA 187 X 305 BONE

Tiene:
LAMINA
187
X
305
BONE

Quiero que al mostrar ese campo en el combobox me identifique la ultima parte del campo: BONE

Se podra?':confused:

Estoy cada vez mas espeso, no capto nada.
Saludos

Pues de poder se debe de poder :D:D:D, una pregunta, todos tus registros siguen ese formato?

LAMINA[espacio]187[espacio]X[espacio]305[espacio]BONE

Si es así puedes usar esta función que me encontre creo en Trucomanía.

Código Delphi [-]
function GetToken(Cadena,Separador:string;Token:integer):string;
var
  Posicion:integer;
begin
   while Token > 1 do begin
     Delete(Cadena,1,Pos(Separador,Cadena));
     Dec(Token);
   end;
   Posicion:=Pos(Separador,Cadena);
   if Posicion=0 then result:=cadena
   else Result:=Copy(Cadena,1,Posicion-Length(Separador));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetToken('LAMINA 187 X 305 BONE',' ',5));
  ShowMessage(GetToken('LAMINA 187 X 305 BLANCO',' ',5));
end;

Salud OS

Edito: Vaya amigo Dec, me ganaste y me parece que tu función GetLaminaType() esta optimizada .... :)

dec 08-04-2008 04:20:57

Hola,

Yo sigo a lo mío... :D Creo que mi anterior función podría (y aun debería) quedar así, mejor o peor:

Código Delphi [-]
function GetLaminaType(rawData: string): string;
var
  i: integer;
begin
  result := '';
  i := Length(rawData);
  while (i >= 1) do begin
    if (rawData[i] = ' ') then
      break;
    result := rawData[i] + result;
    Dec(i);
  end;
end;

Nótese que ahora el bucle aguantaría mientras la variable "i" valiera igual o más que 1. ¿Por qué así ahora? Porque, si no recuerdo mal, las cadenas en Delphi son "Arrays" de caracteres cuyo índice comienza en uno, no en cero. Tal anteriormente la función de marras podría haber dado algún problema... ¡tal vez incluso ahora pueda darlos! :D :D

PD. Probándolo de nuevo no parece haber problema con el "cero", pero, el "uno" me sigue pareciendo más oportuno. Además he añadido el "result" del principio, por principio. ;)

keyboy 08-04-2008 04:26:16

Yo propongo esta:

Código Delphi [-]
function DameElTipo(Dato: String): String;
var
  Espacio: Integer;

begin
  Espacio := Pos(' ', ReverseString(Dato));
  Result := Copy(Dato, Length(Dato) - Espacio + 2, Length(Dato));
end;

Bye

dec 08-04-2008 04:26:21

Hola,

Cita:

Empezado por egostar
Vaya amigo Dec, me ganaste y me parece que tu función GetLaminaType() esta optimizada .... :)

Huy... no sé qué te diga... bueno, sí: que la tuya me parece curiosa. ;)

Y, respecto de la del compañero keyboy, chico, yo probé con el "Reverse" pero me hice un lío... :D :D :D

Por cierto, creo que la de keyboy se muestra favorita, ahora, eso sí, le falta algo:

Código Delphi [-]
uses
  StrUtils;

:D :D :D

egostar 08-04-2008 04:40:03

Cita:

Empezado por dec (Mensaje 278178)
Huy... no sé qué te diga... bueno, sí: que la tuya me parece curiosa. ;)

:eek:, de que hablas amigo Dec :D:D:D

Cita:

Empezado por dec (Mensaje 278178)
Y, respecto de la del compañero keyboy, chico, yo probé con el "Reverse" pero me hice un lío... :D :D :D

Por cierto, creo que la de keyboy se muestra favorita, ahora, eso sí, le falta algo:

mmmm, Yo ni siquiera he podido ver como funciona ese ReverseString(), no existe en mi rudimentario Delphi4 :o, bueno, ya vere mañana en mi TurboDelphi :cool:

Salud OS

Delphius 08-04-2008 04:43:02

Jeje... me ganaron... yo ya estaba preparando una función... pero bueno... mejor no intento.

Total, cuando vengan por aquí Domingo y Javier veremos como queda la cosa.:D

Mientras tanto veo como ganarles en ASM.:p:D:rolleyes:

Saludos,

dec 08-04-2008 04:57:13

Hola,

Cita:

Empezado por egostar
mmmm, Yo ni siquiera he podido ver como funciona ese ReverseString(), no existe en mi rudimentario Delphi4

Aquí Zarko Gajic implementa una función "ReverseString()", e informa de que existe desde Delphi 6. ;)

keyboy 08-04-2008 06:13:52

En realidad lo de ReverseString está muy jalado :) pues al final termina haciendo el recorrido inverso. Mucho mejor la de dec que creo se puede simplificar un poco:

Código Delphi [-]
function DameloYa(Dato: String): String;
var
  I: Integer;

begin
  for I := Length(Dato) downto 1 do
    if Dato[i] = ' ' then
      break;

  Result := Copy(Dato, I + 1, Length(Dato));
end;

Bye

egostar 08-04-2008 17:14:14

Cita:

Empezado por dec (Mensaje 278185)
Aquí Zarko Gajic implementa una función "ReverseString()", e informa de que existe desde Delphi 6. ;)

Eso mismo pensé :)

Cita:

Empezado por keyboy (Mensaje 278195)
En realidad lo de ReverseString está muy jalado :) pues al final termina haciendo el recorrido inverso. Mucho mejor la de dec que creo se puede simplificar un poco:

Y bueno, como lo dije, ya he probado la función ReverseString() en mi TurboDelphi y puede ser que no sea tan "jalado" en ciertas circunstancias.

De cualquier forma esto me hace auto-enviarme a RTFM :D:D:D

Salud OS

Caral 08-04-2008 17:50:46

Hola
Sois unos maestros, pero casualmente aveces no os dais cuenta de quien pregunta (el Novato).:D:D
Esto de las funciones me mata.:o
Alguien me lo traduce.:D
Recordad, tengo un combobox, de ahi parto, la información entra en el.
Como uso la función para llamar al dato que contiene el combobox.:confused:
Ya se, nunca aprenderé, pero de que lo intento, lo intento.:D
Saludos

egostar 08-04-2008 17:58:11

Cita:

Empezado por Caral (Mensaje 278306)
Hola
Sois unos maestros, pero casualmente aveces no os dais cuenta de quien pregunta (el Novato).
Esto de las funciones me mata.
Alguien me lo traduce.
Recordad, tengo un combobox, de ahi parto, la información entra en el.
Como uso la función para llamar al dato que contiene el combobox.
Ya se, nunca aprenderé, pero de que lo intento, lo intento.
Saludos

Hola amigo "NOVATO" :D, lo que pasa es que no entiendo que es lo que quieres hacer, la parte de obtener el color ya está resuelta, ahora hay que resolver lo que tu mente quiere hacer :D:D:D

Será que nos expliques un poco mas a detalle que es lo que intentas? :)

Salud OS

Caral 08-04-2008 18:03:48

Hola
Que poca paciencia me tienes, te esta volviendo viejo amigo:D:D.
Vamos otra vez.
Tengo un campo. (text)
Recojo el dato en un combobox.
Ahora con la función que hicisteis quiero saber la ultima parte de ese dato.
No lo capto, seguro es facil y vosotros lo veis, pero yo no.:D
Anda, que no te cuesta nada explicárselo al Novato.:D:D
Saludos

Delphius 08-04-2008 18:08:26

Amigo! Me extraña!

Creo el Alz te ha visitado:D
Bueno creo que a lo que te refieres es a esto:

Código Delphi [-]
VariableOPriedad := NombreDeLaFuncion(VariablesOPropiedadesOConstantes);

Por ejemplo:

Código Delphi [-]
UnColor := DameloYa(ComboBox1.Text);

:confused:
Saludos,

egostar 08-04-2008 18:15:22

Cita:

Empezado por Caral (Mensaje 278312)
Hola
Que poca paciencia me tienes, te esta volviendo viejo amigo:D:D.
Vamos otra vez.
Tengo un campo. (text)
Recojo el dato en un combobox.
Ahora con la función que hicisteis quiero saber la ultima parte de ese dato.
No lo capto, seguro es facil y vosotros lo veis, pero yo no.:D
Anda, que no te cuesta nada explicárselo al Novato.:D:D
Saludos

Código Delphi [-]
function DameloYa(Dato: String): String;
var
  I: Integer;

begin
  for I := Length(Dato) downto 1 do
    if Dato[i] = ' ' then
      break;
  Result := Copy(Dato, I + 1, Length(Dato));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Edit1.Text := DameloYa(ComboBox1.Text);
end;

Salud OS

Caral 08-04-2008 18:23:17

Hola
Veis, no dolió, ahora si lo capte, era solo de tomarme la pastilla del Altz y ya.:D:D
Algún día entenderé esto de las funciones.:D
Gracias, ya esta resulto, la próxima vez pregunto mejor.:)
Para que veáis como quedo, (Use la función de Dec.):
Código Delphi [-]
procedure TFOrdenProdAcrilico.CBLaminaChange(Sender: TObject);
var
color: string;
begin
 Color:= GetLaminaType(CBLamina.Text);
 showmessage(color);
   QTemp.Close;
   QTemp.SQL.Text := 'SELECT Materiales.Disponible FROM Materiales WHERE Materiales.Descripcion = :Disp';
   QTemp.Parameters[0].Value:= CBLamina.Text;
   QTemp.Active := True;
   Dispon.Text:= QTemp.Fields[0].Text;
end;

Saludos

Caral 08-04-2008 19:36:54

Hola
Bueno, aqui sigo molestando, otro asunto:
Ya consegui que me mostrara el color con la funcion, esto esta bien.
Ahora lo que necesito es que una vez que consiga el color del combo, me carge en otro combo los datos de otros productos que tienen tambien esa condicion.
Para que os deis cuenta.
1- paso:
Cargo de combobox ( LAMINA 187 X 305 BONE )
Genero la funcion y me da el color.
Esto va bien.

2- paso:
Una vez cargado el dato del color quiero que se me genere una consulta
Y que me carge en otro combobox el dato que tenga tambien la condicion de Color.
El dato es este:
IBIZA TERMOFORMADO BONE

Lo que tengo:
Código Delphi [-]
procedure TFOrdenProdAcrilico.CBLaminaChange(Sender: TObject);
var
ColorL: string;
begin
   ColorL:= GetLaminaType(CBLamina.Text);
   EColor.Text:= ColorL;
   QTemp.Close;
   QTemp.SQL.Text := 'SELECT Materiales.Disponible FROM Materiales WHERE Materiales.Descripcion = :Disp';
   QTemp.Parameters[0].Value:= CBLamina.Text;
   QTemp.Active := True;
   Dispon.Text:= QTemp.Fields[0].Text;

// aqui es donde lo necesito

   QTemp.SQL.Text := 'SELECT Materiales.Descripcion FROM Materiales WHERE Materiales.Notas ="TERM" ORDER BY Materiales.Descripcion';
   QTemp.Active := True;
   While not QTemp.Eof do
   begin
      CBPieza.Items.Add(QTemp.Fields[0].Text);
      QTemp.Next;
   end;
   QTemp.Active := False;
end;
Ojala me entendáis.
Saludos


La franja horaria es GMT +2. Ahora son las 09:02:07.

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