Ir al contenido


Foto

[RESUELTO] Un while por cada n cantidad de registros


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

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 enero 2011 - 08:17

Hola amigos tengo el siguiente code:



delphi
  1. if ZK.ReadAllGLogData(DevId) then
  2.     while ZK.SSR_GetGeneralLogData(DevId,dwEnrollNumber,dwVerifyMode,dwInOutMode,
  3.                                   dwYear,dwMonth,dwDay,dwHour,dwMinute,dwSecond,dwWorkCode) do
  4.     begin
  5.  
  6.       ShortDateFormat := 'yyyy/mm/dd';
  7.       ShortTimeFormat := 'hh:mm';
  8.       TimeSeparator := ':';
  9.       DateSeparator := '/';
  10.       Fecha := StrToDateTime(IntToStr(dwYear)+'/'+IntToStr(dwMonth)+'/'+IntToStr(dwDay)+' '+IntToStr(dwHour)+':'+IntToStr(dwMinute));
  11.       s := format('%.*d',[7,StrToInt(dwEnrollNumber)])+'>'+FormatDateTime('yyyy/mm/dd', Fecha)+':'+FormatDateTime('hh:mm', Fecha) + Char(#13) + Char(#10);
  12.       Data.Add(s);
  13.     end;



Trabajo con equipos biométricos, el code anterior descarga la data de asistencias almacenada en dicho equipo, la cual funciona perfectamente, el caso es que luego de 6,000 registros ya la cosa tarda demasiado al punto de no descargarse nada, mi duda es si se puede hacer una while por cada 500 registros, o sea, lea los primeros 500 registros en memoria y luego continúe con los siguientes 500 registros y así sucesivamente hasta terminar. 

Saludos.
  • 0

#2 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 17 enero 2011 - 08:28

Creo que no entiendo muy bien tu pregunta ¿quieres algo como esto?  ^o|



delphi
  1. i:= 0;
  2. if ZK.ReadAllGLogData(DevId) then
  3.     while ZK.SSR_GetGeneralLogData(DevId,dwEnrollNumber,dwVerifyMode,dwInOutMode,
  4.                                   dwYear,dwMonth,dwDay,dwHour,dwMinute,dwSecond,dwWorkCode) do
  5.     begin
  6.  
  7.       inc(i);
  8.  
  9.       ShortDateFormat := 'yyyy/mm/dd';
  10.       ShortTimeFormat := 'hh:mm';
  11.       TimeSeparator := ':';
  12.       DateSeparator := '/';
  13.       Fecha := StrToDateTime(IntToStr(dwYear)+'/'+IntToStr(dwMonth)+'/'+IntToStr(dwDay)+' '+IntToStr(dwHour)+':'+IntToStr(dwMinute));
  14.       s := format('%.*d',[7,StrToInt(dwEnrollNumber)])+'>'+FormatDateTime('yyyy/mm/dd', Fecha)+':'+FormatDateTime('hh:mm', Fecha) + Char(#13) + Char(#10);
  15.       Data.Add(s);
  16.       if i = 500 then
  17.       begin
  18.         // Aqui haces lo que quieras con los datos
  19.         i:= 0;
  20.         Data.Clear; 
  21.       end;
  22.     end;



O puedes que esto:


delphi
  1. if ZK.ReadAllGLogData(DevId) then
  2.     while ZK.SSR_GetGeneralLogData(DevId,dwEnrollNumber,dwVerifyMode,dwInOutMode,
  3.                                   dwYear,dwMonth,dwDay,dwHour,dwMinute,dwSecond,dwWorkCode) do
  4.     begin
  5.  
  6.  
  7.       ShortDateFormat := 'yyyy/mm/dd';
  8.       ShortTimeFormat := 'hh:mm';
  9.       TimeSeparator := ':';
  10.       DateSeparator := '/';
  11.       Fecha := StrToDateTime(IntToStr(dwYear)+'/'+IntToStr(dwMonth)+'/'+IntToStr(dwDay)+' '+IntToStr(dwHour)+':'+IntToStr(dwMinute));
  12.       s := format('%.*d',[7,StrToInt(dwEnrollNumber)])+'>'+FormatDateTime('yyyy/mm/dd', Fecha)+':'+FormatDateTime('hh:mm', Fecha) + Char(#13) + Char(#10);
  13.       Data.Add(s);
  14.       if Data.Count = 500 then
  15.       begin
  16.         Data.Clear; 
  17.       end;
  18.     end;




  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 17 enero 2011 - 08:34

Ya checaste cual es la capacidad de la propiedad Data ?

Salud OS
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 enero 2011 - 08:36

Es más parecido a la primera opción, es sólo que no entra al while de nuevo para los siguientes 500 registros y así sucesivamente.

Saludos.
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 enero 2011 - 08:43

Ya checaste cual es la capacidad de la propiedad Data ?

Salud OS


Data es un TStringList, tiene algo que ver con su capacidad??
  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 17 enero 2011 - 08:45


Ya checaste cual es la capacidad de la propiedad Data ?

Salud OS


Data es un TStringList, tiene algo que ver con su capacidad??


Pues por lo que comentas, me parece que hay algun problema con el StringList ya que vas agregando la info en esa variable.

.....el caso es que luego de 6,000 registros ya la cosa tarda demasiado al punto de no descargarse nada....


Salud OS
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 enero 2011 - 09:31

Alguien sabe cual es la capacidad máxima de un TStringList??, porque hago el siguiente truco:



delphi
  1. StringList1.capacity := StringList1.Count + TotaldeRegistros;



Pero al parecer me ignora, hago esto para descartar que sea el StringList el que me este causando el problema.

Saludos.
  • 0

#8 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 17 enero 2011 - 10:02

Alguien sabe cual es la capacidad máxima de un TStringList??, porque hago el siguiente truco:



Dudo que sea un problema ligado a la capacidad de la clase ya la propiedad TEXT que es de tipo String o más propiamente AnsiString (LongString). Este tipo de datos es dinámico y está limitado unicamente por la capacidad de memoria del entorno.

No olvidemos que a menos que habilitemos en las propiedades del compilador el stict-var-strings. Todas los propiedades o variables que definamos como String en realidad serán LongString.


Saludos
  • 0

#9 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 17 enero 2011 - 10:03

Hola amigos tengo el siguiente code:


Trabajo con equipos biométricos, el code anterior descarga la data de asistencias almacenada en dicho equipo, la cual funciona perfectamente, el caso es que luego de 6,000 registros ya la cosa tarda demasiado al punto de no descargarse nada, mi duda es si se puede hacer una while por cada 500 registros, o sea, lea los primeros 500 registros en memoria y luego continúe con los siguientes 500 registros y así sucesivamente hasta terminar. 

Saludos.


El problema amigo está ligado a la capacidad de memoria del equipo donde realizas la operación. En lugar de almacenar por completo la información en un Stringlist te convendria escribirla directamente en disco o en su defecto cada 500 registros ir guardando el contenido en disco y limpiar el objeto stringlist.

Saludox
  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 enero 2011 - 10:07

Bueno pues algo ocurre, ya que menos de 6,000 registros se descargan aunque tarda un poco. Probaré si es por el tipo de conección. (LAN, COM, USB) Ya les comentaré lso resultados.

Saludos.
  • 0

#11 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 enero 2011 - 11:11

Probado a través del Puerto COM (Serial RS232) y se descargó correctamente, parece que el problema tiene que ver con la conección LAN y no por la capacidad del StringList, doy por RESUELTO el tema (y).

Saludos y gracias a todos.
  • 0




IP.Board spam blocked by CleanTalk.