Ir al contenido


Foto

[RESUELTO] Comparar una cadena de texto dentro de otra


  • Por favor identifícate para responder
20 respuestas en este tema

#1 thelibmx

thelibmx

    Newbie

  • Miembros
  • Pip
  • 6 mensajes
  • LocationMéxico

Escrito 27 enero 2010 - 05:38

Hola amigos aqui haciendo  una tormenta de un vaso de agua, quiero comparar dos cadenas o mas bien, quiero ver si una cadena se encuentra dentro de otra  pero la situación es un tanto especial ya que los valores estan separados por comas he estado investigando un poco y he dado con diversas funciones Pos,AnsiContainsStr, AnsiCompareStr, mis cadenas las obtengo de una base de datos, el caso es que cuando son de un caracter me funciona, pero cuando son dos o mas ya no y es ahí donde me atoro, el tipo de comparación es asi:

quiero saber si la cadena A se encuentra dentro de la cadena B
digamos que la cadena B son una serie de permisos,separados con coma y la cadena A es con el que cuenta,
ejemplo

A:="9"  y  B:="01,02,1,05,3,06,9,8,07,11,23,45,65,35"

el 9 si se encuentra dentro de la cadena B
entonces si tiene acceso


y ahi todo bien, pero cuando es de dos digitos digamos

A:=07  y  B:="01,02,1,05,75,3,06,9,8,5,11,23,45,65,35"

ahi ya no va bien la cosa , pues me detecta que si hay un 0 o 7 y me deja entrar pero no existe en realidad el permiso 07

entonces para que pueda accesar la cadena debe de contener dentro de ella el 07 asi

A:=07
B:="01,02,1,05,75,3,06,9,8,5,11,23,07,45,65,35"


no se si me explique bien el caso es que yo tengo algo asi

delphi
  1. if AnsiContainsStr (B,A) then
  2. begin
  3.   showmessage('Acceso con exito');
  4. end
  5. else begin
  6. MessageBox(Handle,PChar('No cuenta con el permiso correspondiente');
  7. end;



No se si sea la manera mas correcta de hacerlo, pero es mas o menos el proceso,y me deja pasar aun cuando no hay ese tipo de permiso, espero haberme explicado bien si no cualquier duda la respondere, agradezco cualquier ayuda,consejo o sugerencia que me puedan dar...
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 27 enero 2010 - 05:59

La situación aquí es diferente porque se trata de números enteros y esa función está hecho más para texto que números, aquí hay que realizar una especie de algoritmo que elimine el cero por delante o formatear los valores con format y luego comparar la cadena, es todo lo que se me ocurre, pues no conozco una función similar para números, a ver qué dicen los maestros.

Saludos.
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 27 enero 2010 - 06:01

Y que tal una chapuza de las que se acostumbran por aquí :D :D :D



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   A,B: string;
  4. begin
  5.   A:= '06';
  6.   B:= '01,02,1,05,75,3,06,9,8,5,11,23,45,65,35';
  7.   if AnsiContainsStr ( ','+B+',' , ','+A+',' ) then // le agregas las comas a ambas variables y prueba :)
  8.   begin
  9.     showmessage('Acceso con exito');
  10.   end
  11.   else begin
  12.         ShowMessage('No cuenta con el permiso correspondiente');
  13.   end;
  14. end;



Salud OS
  • 0

#4 thelibmx

thelibmx

    Newbie

  • Miembros
  • Pip
  • 6 mensajes
  • LocationMéxico

Escrito 27 enero 2010 - 06:22

:shocked: egostar  Maestro de Maestros muchas gracias, su chapuza como magia, "Pequeñas cosas que hacen grandes cosas"

(y)

  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 27 enero 2010 - 06:27

Ah que bien que le sirvio, me alegra mucho :)

Salud OS


  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 27 enero 2010 - 06:52

Hola de nuevo

También podemos hacer algo mas ortodoxo, pero implica que tengas que rediseñar la logica de tus permisos es decir que no haya 01 y 1 que todos tus permisos sean diferentes al convertirlos a entero. Te daré la idea y tu decides si te sirve o lo dejas como quedó. :)



delphi
  1. type
  2.   TInteger = 1..255;
  3.   TIntSet = set of TInteger;
  4.  
  5. var
  6.   Privilegios: TIntSet;
  7.  
  8. procedure TForm1.AsignaPrivilegios;
  9. begin
  10.   Privilegios := [];
  11.   Table1.Open;
  12.   if Table1.RecordCount > 0 then
  13.   begin
  14.     while not Table1.Eof do
  15.     begin
  16.       // Se agregan los privilegios al set de privilegios
  17.       Include(Privilegios,Table1.FieldByName('privilegios').AsInteger);
  18.       Table1.Next;
  19.     end;
  20.   end;
  21.   Table1.Close;
  22. end;
  23.  
  24. procedure TForm1.Button1Click(Sender: TObject);
  25. begin
  26.   if StrtoInt(Edit1.Text) in Privilegios then
  27.   begin
  28.     showmessage('Acceso con exito');
  29.   end
  30.   else begin
  31.         ShowMessage('No cuenta con el permiso correspondiente');
  32.   end;
  33. end;



Salud OS
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 27 enero 2010 - 07:43

Una opción más:



delphi
  1. function CompareInt(Value1, Value2: string; delimiter: Char): Integer;
  2. var
  3.   Permisos: TStringList;
  4.   i,c: Integer;
  5.   Value3, dato : string;
  6. begin
  7.   c := 0;
  8.   Value3 := '';
  9.   if Copy(Value1,1,1) = '0' then
  10.         Value1 := StringReplace(Value1, '0', '', [rfReplaceAll]);
  11.  
  12.   Permisos := TStringList.Create;
  13.   Assert(Assigned(Permisos));
  14.   Permisos.Clear;
  15.   Permisos.Delimiter := delimiter;
  16.   Permisos.DelimitedText := Value2;
  17.   for i := 0 to Permisos.Count-1 do begin
  18.     if Copy(Permisos.Strings[i],1,1) = '0' then
  19.         value3 := value3 + StringReplace(Permisos.Strings[i],'0','', [rfReplaceAll]) +','
  20.     else begin
  21.         value3 := value3 + Permisos.Strings[i] +',';
  22.         Inc(c);
  23.     end;
  24.   end;
  25.  
  26.   if AnsiContainsStr(Value3, Value1) then
  27.     Result := 1
  28.   else
  29.     Result := -1;
  30. end;
  31.  
  32. procedure TForm1.btn1Click(Sender: TObject);
  33. var A,B: string;
  34. begin
  35. A := '01';
  36. B := '01,10,20,30';
  37.  
  38.   if CompareInt(A,B,',') = 1 then
  39.     ShowMessage('Acceso permitido')
  40.   else
  41.     ShowMessage('No tienes permisos');
  42. end;



Al igual que Egostar debes redefinir los permisos, que no existan 01 y 1 y similares.

Saludos.
  • 0

#8 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 27 enero 2010 - 07:51

Si la cantidad de los permisos que defines son de 3 digitos, deberas de homologar y grabar todos los permisos con esa misma estructura..

Ejemplo:

A=100
B="001,002,050,030,003,120,089"

Ya que de esta forma siempre tendrias segun los permisos una opcion definida, y si no la homologas tendrias algunos problemas de coincidencias a permisos no definidos.

Ejemplo

A=7
B="1,2,3,17,30,57,107"    <--  Si la ENCONTRARIA pero no seria el PERMISO INDICADO





  • 0

#9 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 27 enero 2010 - 08:38

Que tal muchachos, solo una pequeña duda que me surgio:

¿Por que no utilizan la funcion POS?

tal vez algo asi se podria hacer


delphi
  1. var
  2.   a,b: string;
  3.  
  4. begin
  5.   a:= '09';
  6.   b:= '01,02,03,04,05';
  7.  
  8.   if pos(a,b) <> 0 then
  9.     showmessage('Acceso con exito')
  10.   else
  11.     showmessage('no cuenta con los permisos necesarios');
  12.  
  13. end;



saludos

Kafastoforman
  • 0

#10 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 27 enero 2010 - 08:42

POS NO SÈ PORQUE    :cheesy:

:smiley:
  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 27 enero 2010 - 08:44

Hola amigo Kafastoforman

El problema del POS como en las demas funciones es que en la lógica que maneja nuestro amigo thelibmx contiene números de un digito, por lo que si haces un post a este ejemplo



delphi
  1. var
  2.   a,b: string;
  3. begin
  4.   a:= '5';
  5.   b:= '01,05,55,35,50';
  6.   if pos(a,b) <> 0 then
  7.     showmessage('Acceso con exito')
  8.   else
  9.     showmessage('no cuenta con los permisos necesarios');
  10.  
  11. end;



El resultado es incorrecto ya que encuentra que el 5 existe en la cadena, pero en realidad no existe el número '5'.

Salud OS
  • 0

#12 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 27 enero 2010 - 09:03

haaaaaaa :shocked:

entonces podriamos hacer esto no?



delphi
  1. var
  2.   a,b,amarre: string;
  3.   digitos: integer;
  4.  
  5. begin
  6.   digitos:= 2;
  7.   amarre:= '00000';
  8.   a:= amarre + '5';
  9.   b:= '01,05,55,35,50';
  10.   if pos(copy(a,length(a)-digitos,digitos),b) <> 0 then
  11.     showmessage('Acceso con exito')
  12.   else
  13.     showmessage('no cuenta con los permisos necesarios');
  14.  
  15. end;



y cambiando digitos, podriamos elegir la cantidad de digitos que se desee

:D ¿que tal?

Saludos kafastoforman
  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 27 enero 2010 - 09:09

:D :D :D, interesante, el asunto es que como te digo la lógica que se sigue en este problema es que no es lo mismo 05 que 5 así que debe encontrarse exactamente el valor deseado, la chapuza que publiqué hace lo que nuestro amigo desea, sin complicaciones y sin bug's (como a primera vista se podría pensar, jejejeje).

Salud OS
  • 0

#14 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 27 enero 2010 - 10:39

jajajajaja ya entendí, por eso te digo que la chapuza esta ley, jejejeje.

Me costo trabajo entender que la longitud es variable y que asi como puede haber 05 puede haber 205 o 2005 o 2055 etc, jejejeje sorry.

:D Buenas noches ;)
  • 0

#15 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 28 enero 2010 - 03:18

Siguiendo con la tónica de considerar los permosos como enteros, siendo lo mismo 1 que 01, podemos implementar algo sencillo usando la VCL:



delphi
  1. function TienePermiso(Permiso, Permitidos: String): boolean;
  2. var
  3.   Lista: TStringList;
  4.   P, i: integer;
  5. begin
  6.   while Pos(',', Permitidos)>0  do
  7.         Permitidos[Pos(',', Permitidos)]:= #13;
  8.   Lista:= TStringList.Create();
  9.   Lista.Text:= Permitidos;
  10.   Result := False;
  11.   for i:= 0 to Lista.Count-1 do
  12.     if StrToInt(Lista[i]) = StrToInt(Permiso) then
  13.     begin
  14.       Result:= True;
  15.       break;
  16.     end;
  17.     Lista.Free;
  18. end;



Ejemplo de uso:


delphi
  1. if TienePermiso('6', '01,02,05,75,3,06,9,8,5,11,23,07,45,65,35') then
  2.     ShowMessage('Eureca');



Saludos.
  • 0

#16 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 28 enero 2010 - 08:59

Ah caray, parece que me pasé de líneas :( :p (y)
  • 0

#17 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 28 enero 2010 - 09:18

:cheesy: jajaja esa es de apagar las luces e irse a dormir jejejeejej muy buen código  :cool:

solo, no vi donde se ocupa la variable de tipo entero P


saludos
  • 0

#18 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 28 enero 2010 - 11:01

:cheesy: jajaja esa es de apagar las luces e irse a dormir jejejeejej muy buen código  :cool:

solo, no vi donde se ocupa la variable de tipo entero P


saludos


Efectivamente, esa variable se me coló. Podeis eliminarla. :cheesy:

Saludos.
  • 0

#19 thelibmx

thelibmx

    Newbie

  • Miembros
  • Pip
  • 6 mensajes
  • LocationMéxico

Escrito 28 enero 2010 - 11:56

Muchas Gracias a todos por responder, es interesante todos los aportes que me han dado los tomare en cuenta para futuros programas,y como comento egostar la cadena contiene valores de diferente longitud, mas que nada lo que me interesaba era que se pudiera encontrar la cadena de caracteres en conjunto  y no solo uno de sus caracteres,que era lo que me pasaba, su chapuza quedo bien y hasta el momento parece que no hay errores, a veces dicen que no hay que buscarle tres pies al gato jejej Gracias totales....

P.D. No se como funciona este foro, si tengo que darles las gracias a cada uno de los que respondieron pues todas sus respuestas son buenas o solo al que me ayudo a resolver el problema,como sea no me cuesta agradecer a cada uno  :cheesy:
  • 0

#20 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 28 enero 2010 - 11:59

P.D. No se como funciona este foro, si tengo que darles las gracias a cada uno de los que respondieron pues todas sus respuestas son buenas o solo al que me ayudo a resolver el problema,como sea no me cuesta agradecer a cada uno...


A cada uno de los que consideres ;)
  • 0




IP.Board spam blocked by CleanTalk.