Verificação se registro Existe em fração de segundos
Olá
E ai galera... pelo assunto parece ser algo bem simples de fazer, mas na prática estou tendo dificuldades. Tenho um sistema que captura todas as informações de jobs impressos em um servidor de impressão (aproximadamente 80 impressoras instaladas), porém estão havendo várias inconsistências de registros e em alguns casos ele não está nem conseguindo capturar a informação do job. Tenho uma unit que consegui no grupo dos desenvolvedores da CodeGear, onde tenho uma procedure que retorna uma lista dos jobs com STATUS concluído, e para cada job da fila essa procedure retorna cerca de 4 a 6 registros, praticamente com as mesmas informações, exceto o número de páginas do job, que pode variar e nesse caso, preciso pegar o maior registro que é retornado.
Estou usando um ClientDataSet em memória onde faço um insert na primeira vez que o id do job é retornado pela função, e nas próximas vezes faço um pesquisa através do locate no ClientDataSet, e dou um Update caso o volume de páginas seja maior ao já cadastrado.
Meu problema é que todo esse processo demora menos de 1 segundo, e levando em consideração que essas cerca de 80 impressões podem imprimir quase que ao mesmo tempo (imagino que no pico de impressões cerca de 40 requisições são feitas ao clientdataset em 1 segundo).
Creio que nesse caso o ClientDataSet em memória não seja a forma mais aconselhável, mas não sei nenhuma outra forma de guardar todas essas informações por cerca de 20 minutos onde todas as informações são gravadas em um banco de dados e excluídas da memória salvo a condição de não existir nenhum job sendo concluído na fila.
Alguém poderia me dar alguma outra dica de trabalhar com essas informações, onde o espaço de tempo entre os registros e a pesquisa dos mesmos não fosse causar perda de informações.
Dicas serão muito bem-vindas.
Agradeço desde já pela ajuda.
Att
E ai galera... pelo assunto parece ser algo bem simples de fazer, mas na prática estou tendo dificuldades. Tenho um sistema que captura todas as informações de jobs impressos em um servidor de impressão (aproximadamente 80 impressoras instaladas), porém estão havendo várias inconsistências de registros e em alguns casos ele não está nem conseguindo capturar a informação do job. Tenho uma unit que consegui no grupo dos desenvolvedores da CodeGear, onde tenho uma procedure que retorna uma lista dos jobs com STATUS concluído, e para cada job da fila essa procedure retorna cerca de 4 a 6 registros, praticamente com as mesmas informações, exceto o número de páginas do job, que pode variar e nesse caso, preciso pegar o maior registro que é retornado.
Estou usando um ClientDataSet em memória onde faço um insert na primeira vez que o id do job é retornado pela função, e nas próximas vezes faço um pesquisa através do locate no ClientDataSet, e dou um Update caso o volume de páginas seja maior ao já cadastrado.
Meu problema é que todo esse processo demora menos de 1 segundo, e levando em consideração que essas cerca de 80 impressões podem imprimir quase que ao mesmo tempo (imagino que no pico de impressões cerca de 40 requisições são feitas ao clientdataset em 1 segundo).
Creio que nesse caso o ClientDataSet em memória não seja a forma mais aconselhável, mas não sei nenhuma outra forma de guardar todas essas informações por cerca de 20 minutos onde todas as informações são gravadas em um banco de dados e excluídas da memória salvo a condição de não existir nenhum job sendo concluído na fila.
Alguém poderia me dar alguma outra dica de trabalhar com essas informações, onde o espaço de tempo entre os registros e a pesquisa dos mesmos não fosse causar perda de informações.
Dicas serão muito bem-vindas.
Agradeço desde já pela ajuda.
Att
Maikel
Curtidas 0
Respostas
Paulo Samurai
25/09/2007
Olá, não sei se resolverá, mas uma ideia seria dividir o processo em duas threads.
Uma delas pegaria e popularia uma lista com os jobs, sempre adicionando. A outra se preocuparia com analisar a lista, remover as duplicações e armazenar os dados no bd.
A thread de leitura teria maior prioridade :)
[]´s
Uma delas pegaria e popularia uma lista com os jobs, sempre adicionando. A outra se preocuparia com analisar a lista, remover as duplicações e armazenar os dados no bd.
A thread de leitura teria maior prioridade :)
[]´s
GOSTEI 0
Maikel
25/09/2007
Bom dia Paulo Samurai
Agradeço muito pela sua atenção e ajuda, e se possível, pedir mais um help.
Você teria algum exemplo ai de como trabalhar com thread, como faço para jogar os valores a ela, pesquisar registros existentes e depois como resgatar os mesmos para serem jogados np BD.
Valeu...
Att
Agradeço muito pela sua atenção e ajuda, e se possível, pedir mais um help.
Você teria algum exemplo ai de como trabalhar com thread, como faço para jogar os valores a ela, pesquisar registros existentes e depois como resgatar os mesmos para serem jogados np BD.
Valeu...
Att
GOSTEI 0
Paulo Samurai
25/09/2007
Olá, eu tenho pouca experiencia com thread, mas a ideia é a seguinte:
Para usar a thread seria assim:
No caso, voce poderia alimentar uma TObjectlist do datamodule ou outra estrutura de dados com os dados obtidos nesta thread... a outra opera com o banco de dados.. o código para operar com o banco de dados é exatamente o mesmo que voce está acostumado a usar... mas a conexão com o banco de dados merece algum cuidado ;)
- Eu prefiro criar minha conexão dentro da propria thread
- ADO requer um CoInitialize para operar com multithread, outros componentes podem ter outras exigencias
Espere que ajude ;)
[]´s
TMinhaThread = class(TThread) private FMensagem: string; procedure AddLog; public property MemoLog: TMemo read FMemoLog write FMemoLog; procedure Execute; override; end; procedure TMinhaThread.Execute; begin // Tudo o que voce escrever aqui vai ser executado durante a thread. // Para iterar com a thread principal voce tem que usar syncronize, ex: FMensagem := ´Passei por aqui´; Syncronize(AddLog); end; procedure TMinhaThread.AddLog; begin if Assigned(FMemoLog) then FMemoLog.Lines.Add(FMensagem); end;
Para usar a thread seria assim:
private FThread: TMinhaThread; .... begin FThread := TMinhaThread.Create(true); FThread.MemoLog := Memo1; FThread.resume; end;
No caso, voce poderia alimentar uma TObjectlist do datamodule ou outra estrutura de dados com os dados obtidos nesta thread... a outra opera com o banco de dados.. o código para operar com o banco de dados é exatamente o mesmo que voce está acostumado a usar... mas a conexão com o banco de dados merece algum cuidado ;)
- Eu prefiro criar minha conexão dentro da propria thread
- ADO requer um CoInitialize para operar com multithread, outros componentes podem ter outras exigencias
Espere que ajude ;)
[]´s
GOSTEI 0
Maikel
25/09/2007
Paulo Samurai... valeu ai pela ajuda... obrigado mesmo
vou tentar usar aqui, encontrei mais alguns materiais na internet e um exemplo bem prático no grupo da CodeGear.
Qualquer coisa posto os resultados aqui.
Valeu
vou tentar usar aqui, encontrei mais alguns materiais na internet e um exemplo bem prático no grupo da CodeGear.
Qualquer coisa posto os resultados aqui.
Valeu
GOSTEI 0