como controlar este processo ????

Delphi

10/10/2003

Pessoal Vejam só preciso ler um arquivo texto e gerar uma tabela ate ai beleza, o lance é este arquivo texto é a junção de vários outros arquivos que monto via .bat, sendo assim só posso começar a gerar minha tabela após ter o arquivo texto devidamente montado pelo .bat, o problema é minha aplicação não entende que o .bat ainda não terminou e já tenta montar a tabela então me dá msg de erro i/o32, ai vou clicando no meu botão que monta o arquivo ai de repente funciona, na verdade como faço pra aplicação esperar o .bat terminar coloquei esta linha de código porém ainda não resolveu

if Rgdepto.ItemIndex = 0 then //cuecas
begin
contar:=0;
while not fileexists(´L:\deptopv9.txt´) do begin
for i :=1 to 15000 do
Inc(contar);
end;
AssignFile (tfarquivo,´L:\deptopv9.txt´);
end;



Aqui escolho o .bat que será executado e mais pra baixo a montagem da tabela que apos excolher o radiogropu clico no botao montar arquivo

if Rgdepto.ItemIndex = 0 then
ShellExecute(Handle, ´Open´, ´L:\gera9txt.bat´, ´´, ´´, SW_hide )
else
if Rgdepto.ItemIndex = 1 then
ShellExecute(Handle, ´Open´, ´L:\gera4txt.bat´, ´´, ´´, SW_hide )
else
if Rgdepto.ItemIndex = 2 then
ShellExecute(Handle, ´Open´, ´L:\gera5txt.bat´, ´´, ´´, SW_hide )
else
if Rgdepto.ItemIndex = 3 then
ShellExecute(Handle, ´Open´, ´L:\geratxt.bat´, ´´, ´´, SW_hide )
else
raise Exception.Create(´Nenhum Departamento foi selecionado´);

apos a escolha do .bat vou pegar o nome do arquivo de acordo com a escolha e montar a tabela
:oops:
if Rgdepto.ItemIndex = 0 then //cuecas
begin
contar:=0;
while not fileexists(´L:\deptopv9.txt´) do begin
Inc(contar);

AssignFile (tfarquivo,´L:\deptopv9.txt´);
end;
if Rgdepto.ItemIndex = 1 then // lingeries
begin
contar:=0;
while not fileexists(´L:\deptopv4.txt´) do begin
Inc(contar);
end;
AssignFile (tfarquivo, ´L:\deptopv4.txt´);
end;
if Rgdepto.ItemIndex = 2 then // meias
begin
contar:=0;
while not fileexists(´L:\deptopv5.txt´) do begin
Inc(contar);
end;
AssignFile (tfarquivo, ´L:\deptopv5.txt´);
end;
if Rgdepto.ItemIndex = 3 then
begin
contar:=0;
while not fileexists(´L:\geralpve.txt´) do begin
Inc(contar);
StatusBar1.SimpleText := ´Gerando Planilha Aguarde´;
end;
AssignFile (tfarquivo, ´L:\geralpve.txt´);
end;

Reset (tfarquivo); //abre arq. para leitura
contador :=0;
While not eof(tfarquivo) do
begin
Readln(tfarquivo,strRegistro); //lê registros
// o primeiro é tipo 01 só pego o periodo inicial e final
if copy(strRegistro,1,2) = ´01´ then
begin
ShortDateFormat := ´yyyy/mm/dd´;
tipo:=copy(strRegistro,23,08);
tipo2:=copy(tipo,1,4)+´/´+copy(tipo,5,2)+´/´+copy(tipo,7,2);
dataini:=StrToDate(tipo2);
tipo:=copy(strRegistro,31,08);
tipo2:=copy(tipo,1,4)+´/´+copy(tipo,5,2)+´/´+copy(tipo,7,2);
datafin:=StrToDate(tipo2);
end;
if copy(strRegistro,1,2) = ´02´ then // somente registro tipo detalhe
begin
if StrToFloat(copy(strRegistro,102,15)) <> 0 then // vendas # zeros
begin
if StrToFloat(copy(strRegistro,118,15)) <> 0 then //Estoque zeros
begin
tblitemlojas.Insert;





if Rgdepto.ItemIndex = 2 then // meias
begin
contar:=0;
while not fileexists(´L:\deptopv5.txt´) do begin
Inc(contar);
end;
AssignFile (tfarquivo, ´L:\deptopv5.txt´);

Silvia Correa Felix Constant


Silvia

Silvia

Curtidas 0

Respostas

Tand

Tand

10/10/2003

Sylvia,

Acho que o melhor seria durante o processamento bat voce criar o arquivo com outro nome e então só depois de criado você daria um rename para o nome correto ai o Delphi só acharia o arquivo após criado.

Abraços,

Espero que ajude.

Alexandre :wink:


GOSTEI 0
Centopocento

Centopocento

10/10/2003

Silvia,

Vc trabalha com que banco? Se for o Interbase uma maneira muito mais rápida, segura e fácil para vc monta sua tabela é utiliza o EXTERNAL FILE.

Se não souber como funciona me contata:

edbasi@hotmail.com

T+

Edgar


GOSTEI 0
Lidiane

Lidiane

10/10/2003

Silvia,
em uma menssagen anterior eu respondi como deveria fazer ;
[url]http://delphiforum.icft.com.br/forum/viewtopic.php?p=60850&highlight=#60850[/url]

Mas acho que você implementou de maneira errada.
faça assim :

 StatusBar1.SimpleText := ´Gerando Planilha Aguarde´;

 if Rgdepto.ItemIndex = 0 then begin
  contar:=0;
  While not fileexists(´L:\deptopv9.txt´) do begin
   Inc(contar);
   if conta = 30000 then begin //espera um tempo se não achar sai
    MessageBox(Handle, ´Tempo limite foi alcançado.´, ´Errrrrrro.´, 16);
    exit;
   end;
  end;
  AssignFile (tfarquivo,´L:\deptopv9.txt´);
 end;

 if Rgdepto.ItemIndex = 1 then begin
  contar:=0;
  While not fileexists(´L:\deptopv4.txt´´) do begin
   Inc(contar);
   if conta = 30000 then begin //espera um tempo se não achar sai
    MessageBox(Handle, ´Tempo limite foi alcançado.´, ´Errrrrrro.´, 16);
    exit;
   end;
  end;
  AssignFile (tfarquivo,´L:\deptopv4.txt´´);
 end;

 if Rgdepto.ItemIndex = 2 then begin
  contar:=0;
  While not fileexists(´L:\deptopv5.txt´) do begin
   Inc(contar);
   if conta = 30000 then begin //espera um tempo se não achar sai
    MessageBox(Handle, ´Tempo limite foi alcançado.´, ´Errrrrrro.´, 16);
    exit;
   end;
  end;
  AssignFile (tfarquivo,´L:\deptopv5.txt´);
 end;

 if Rgdepto.ItemIndex = 3 then begin
  contar:=0;
  While not fileexists(´L:\geralpve.txt´) do begin
   Inc(contar);
   if conta = 30000 then begin //espera um tempo se não achar sai
    MessageBox(Handle, ´Tempo limite foi alcançado.´, ´Errrrrrro.´, 16);
    exit;
   end;
  end;
  AssignFile (tfarquivo,´L:\geralpve.txt´);
 end;
end;


Só lembrando se o arquivo já existir o while vai passar direto ....se for possivel exclua o arquivo ?.txt antes de gerar um novo.

Só não entendo porque gerar arquivo txt com .bat ? :?:


Lidiane


GOSTEI 0
Vinicius2k

Vinicius2k

10/10/2003

Silvia,

essa procedure cria um processo e aguarda seu final... talvez lhe seja útil....
exemplo de aplicação : cria_processo(´CALC.EXE´,´C:\WINNT´);

 procedure cria_processo(nome, path: string);
var StartupInfo: Tstartupinfo;
    ProcessInfo: TprocessInformation;
begin
FillChar(StartupInfo,sizeof(TStartupInfo),0);
StartupInfo.cb:=sizeof(TStartupInfo);
if CreateProcess(nil, pchar(nome), nil, nil, false, normal_priority_class, nil, pchar(path), StartupInfo, ProcessInfo) then 
  WaitForSingleObject (ProcessInfo.hprocess,infinite);
end; 


espero ter ajudado...


GOSTEI 0
POSTAR