Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2010-05

buscar valor en array de record

9 messages · 4 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Paola Bruccoleri

Hola a todos..
Tengo datos cargados en un stringlist (c�digo art, desc, cantidad). En ese stringlist pueden haber c�digos de art�cilos repetidos.. Lo que quiero hacer es juntar todos los c�digos repetidos, actualizando el valor de "cant"
Mi idea es ir recorriendo el stringlist e ir cargando los renglones en un array (c/elemento es un tipo record), pero antes de cargar nada, quiero buscar en ese array por si existe el codigo. En caso de que exista, modificar la cantidad, sino, agregar un nuevo valor. En otros lenguajes tengo funciones de b�squeda en arrays (como este, que ser�a como uno multidimensional), pero ac� se me est� complicando :)

QUiz�s me sugieran algunas otras funciones que desconozco Muchas gracias..
chauuuuuuuu

Reply by email

José Mejuto
to Paola Bruccoleri

Hello Paola,

Monday, May 24, 2010, 9:19:54 PM, you wrote:

PB> Hola a todos..
PB> Tengo datos cargados en un stringlist (c�digo art, desc, cantidad). En PB> ese stringlist pueden haber c�digos de art�cilos repetidos.. PB> Lo que quiero hacer es juntar todos los c�digos repetidos, actualizando PB> el valor de "cant"
PB> Mi idea es ir recorriendo el stringlist e ir cargando los renglones en PB> un array (c/elemento es un tipo record), pero antes de cargar nada, PB> quiero buscar en ese array por si existe el codigo. En caso de que PB> exista, modificar la cantidad, sino, agregar un nuevo valor. PB> En otros lenguajes tengo funciones de b�squeda en arrays (como este, que PB> ser�a como uno multidimensional), pero ac� se me est� complicando :) PB> QUiz�s me sugieran algunas otras funciones que desconozco

A lo "r�pido" y en pseudo c�digo:

StringList.Sort;
j:=0;
while j<StringList.Count-1 do begin
  k:=j;
  while k<StringList.Count-2 do begin
    Clave1:=ExtraeClave(StringList[k]);
    Clave2:=ExtraeClave(StringList[k+1]);
    if Clave1=Clave2 then begin
       ActualizaCantidad(StringList[k],Cantidad(StringList[k])+Cantidad(StringList[k+1]));
       inc(k);
    end else begin
       Break;
    end;
  end;
end;

Lo m�s f�cil es que extraigas todos los datos (despu�s del sort) a un array din�mico de un record con todos los campos, as� te evitas las funciones extraeClave, ActualizaCantidad,....

Best regards, Jos�

Reply by email

José Mejuto
to Paola Bruccoleri

Hello Paola,

Tuesday, May 25, 2010, 12:48:34 AM, you wrote:

PB> el problema de usar esta soluci�n, es que (perd�n por no PB> comentarlo en el primer post pero quise simplificar el ejemplo) es PB> un stringlist un poco particular, ya que uso 2 renglones para PB> colocar datos de un mismo art�culo.. si hago un sort, se me relaja PB> todo!!! y no quiero poner el c�digo en el rengl�n de abajo...

Entiendo, pero visto as� no tienes el TStringList muy bien planteado para trabajar con �l. Si s�lo tienes un regl�n a�adido, bueno o varios, tendr�as que hacer algo como:

LINEAS_EXTRA:=1;
j:=0;
while j<StringList.count-1 do begin
  k:=j+LINEAS_EXTRA;
  while k<StringList.count-1 do begin
    if StringList.Codigo(j)=StringList.Codigo(k) then begin
       StringList.Cantidad(j):=StringList.Cantidad(j)+StringList.Cantidad(k);
       for l:=k to k+LINEAS_EXTRA do begin
         StringList[k]:='';//destruir la linea
       end;
    end;
    inc(k,1+LINEAS_EXTRA);
  end;
  inc(j,1+LINEAS_EXTRA);
end;
j:=StringList.Count-1;
while j>=0 do begin
  if StringList[j]='' then StringList.Delete(j);
end;

Algo as� deber�a de funcionar, creo.

Best regards, Jos�

Reply by email

José Antonio Cuello
to Paola Bruccoleri: Se ha borrado un adjunto en formato HTML... URL:…

Justo te iba a sugerir eso. Sin sencillo de usar y te dan mucha libertad de acci�n.

por otro lado tb podrias emplear 2 arrays uno con los codigos + indice del array de datos y otro con los datos. De esta manera ordenas el de codigos y no todos los datos.

Bueno todo son ideas ... y espero que alguna te ayude. Un saludo.

El lun, 24-05-2010 a las 19:48 -0300, Paola Bruccoleri escribi�:

He encontrado que tb se podr�a usar el objectlist en vez de pasar a un array, pero nunca lo us�..

________________________________________________________________________

ARTEX TRADING S.A.
Jos� Antonio Cuello Principal

Reply by email

Paola Bruccoleri

Hola Jos�..
tendr�as alg�n ejemplo de tobjectloist? si cada elemento fuera un trecord, c�mo buscar�a algo dentro de c/elemento?... (si es que hay alg�n m�todo sin ser buscar secuencialmente...) muchas gracias...

----Mensaje original---- De: josea en artextrading.com Fecha: 25/05/2010 06:06 Para: "Spanish version of Lazarus List"<lazarus-es en lists.lazarus.

freepascal.org>

Asunto: Re: [Lazarus-es] buscar valor en array de record Justo te iba a sugerir eso. Sin sencillo de usar y te dan mucha

libertad

de acci�n. por otro lado tb podrias emplear 2 arrays uno con los codigos +

indice

Show quoted text 8 lines
del array de datos y otro con los datos. De esta manera ordenas el de codigos y no todos los datos. Bueno todo son ideas ... y espero que alguna te ayude. Un saludo. El lun, 24-05-2010 a las 19:48 -0300, Paola Bruccoleri escribi�: > He encontrado que tb se podr�a usar el objectlist en vez de pasar a

un

Show quoted text 16 lines
> array, pero nunca lo us�.. ________________________________________________________________________ ARTEX TRADING S.A. Jos� Antonio Cuello Principal _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Reply by email

José Antonio Cuello
to Paola Bruccoleri

Te envio un ejemplito abajo, creo que en el codigo que te pase hay ejemplos ... mira los tipo_app o tipos_pub (creo recordar). Es sencillo, piensa que muchos eventos se heredan del TObjectList. Deber�as mirar su declaraci�n para saber como hace para ordenar y buscar.

Que yo sepa las busquedas en este tipo de objeto al igual que en el TStringList son secuenciales ... si puedes usar las Rx tienen un MemData que es un dataset en memoria que implementa locate y filtros. Muy util para manejo de datos.

Un saludo.

Ejemplo de declaracion

type
  { TAxFieldDef }
  TAxFieldDef = class
  private
    FTableName: String;
    FFieldName: String;
    FFieldNo  : Integer;
    FTypeOrder: TTypeOrder;
  public
    constructor Create;
    destructor Destroy; override;
    property TableName: String read FTablename write FTablename;
    property FieldName: String read FFieldName write FFieldName;
    property FieldNo  : Integer read FFieldNo write FFieldNo;
    property TypeOrder: TTypeOrder read FTypeOrder write FTypeOrder;
  end;
  { TAxFieldDefList }
  TAxFieldDefList = class(TObjectList)
  protected
    function GetItem( Index: Integer ): TAxFieldDef;
    procedure SetItem( Index: Integer; Sender: TAxFieldDef);
  public
    constructor Create;
    destructor Destroy; override;
    function Add(Item: TAxFieldDef): Integer;
    function Add(TableName, FieldName: String; FieldNo: Integer):
Integer; overload;
    property Items[Index: Integer]: TAxFieldDef read GetItem write
SetItem; default;
  end;

El mar, 25-05-2010 a las 09:44 -0300, Paola Bruccoleri escribi�:

Show quoted text 6 lines
Hola Jos�.. tendr�as alg�n ejemplo de tobjectloist? si cada elemento fuera un trecord, c�mo buscar�a algo dentro de c/elemento?... (si es que hay alg�n m�todo sin ser buscar secuencialmente...) muchas gracias...

________________________________________________________________________

ARTEX TRADING S.A.
Jos� Antonio Cuello Principal

Reply by email

José Mejuto
to Paola Bruccoleri: Hola Jos�.. tendr�as alg�n ejemplo de tobjectloist? si cada elemento fuera un…

Hello Paola,

Tuesday, May 25, 2010, 2:44:14 PM, you wrote:

PB> Hola Jos�..
PB> tendr�as alg�n ejemplo de tobjectloist? si cada elemento fuera un PB> trecord, c�mo buscar�a algo dentro de c/elemento?... (si es que hay PB> alg�n m�todo sin ser buscar secuencialmente...) PB> muchas gracias...

TObjectList te "obliga" a que cada registro sea un objeto, cosa que es innecesaria en este caso. Si tienes que hacer este proceso muuuuchas veces hay que optimizar, si s�lo afectar� unas 200 lineas o as�, hazlo sencillo, hasta haciendolo "mal" ser� muy r�pido. No tiene sentido ganar 100 ms. en una tarea que se repite cada 5 minutos.

Lo m�s sencillo es un array din�mico, lo creas de records en plan:

Cosa=record
  Codigo: string;
  descripcion: string;
  cantidad: double;
  LineasExtra: String o i es necesario TStringList
end;

En un for..loop pasas los datos a un record desde cada linea del TStringList y el registro lo a�ades al dyn array:

arr: array of Cosa;
while ...do begin
 SetLength(Arr,Length(Arr)+1);
 MyCosa:=CamposTStringList;
 Arr[High(arr)]:=MyCosa;
end;

El manejo de arrays din�micos es muy parecido a un TStringList, etc...

Best regards, Jos�

Reply by email

Maxi
to José Mejuto

probaste indexof ? te pasa la primera posicion a lo que buscas.

Twitter: @nenunocomar Maximiliano Duarte Linux User #495070 Ubuntu User #28504 El que pregunta aprende, y el que contesta aprende a responder.

Reply by email