Gravar Arquivo PDF no SQL Server 2000
Saudações!
Talvez pensem que eu tive preguiça de pesquisar ao lerem o título do tópico, mas muita calma nessa hora rsrsrsrs. Estou desenvolvendo uma pequena ferramenta cujo objetivo é copiar arquivos que estão num determinado diretório, que foram gerados de outro sistema, para uma outra pasta, e salvá-los no banco. Esse processo será feito automaticamente, haverá um timer onde a cada 5 min verificará se há arquivos na pasta e executará a rotina. Dei uma pesquisa e encontrei uma solução postada por um amigo daqui, e a implementei na mina rotina. Vejam abaixo
// Código
...
private
vSR: TSearchRec;
vStream: TMemoryStream;
vOrigem, vDestino: string;
...
procedure TForm1.ExecutaOperacao;
var
i: integer;
begin
if not ValidaOperacao then
exit;
i := FindFirst(´C:\Rogério\testes\Gravar Arquivos no Banco\Origem\*.pdf´, faAnyFile, vSR);
while I = 0 do
begin
if (vSR.Attr and faDirectory) <> faDirectory then
begin
vOrigem := ´C:\Rogério\Testes\Gravar Arquivos no Banco\Origem\´ + vSR.Name;
vDestino := ´C:\Rogério\Testes\Gravar Arquivos no Banco\Destino\´ + vSR.Name;
MoveFile(PChar(vOrigem), PChar(vDestino));
ClientDataSet1.Append;
ClientDataSet1PACI_COD.AsString := CapturaParteNomeArq(1);
ClientDataSet1EX_UROD_DAT.AsString := CapturaParteNomeArq(2);
ClientDataSet1EX_UROD_HOR.AsString := CapturaParteNomeArq(3);
CapturaArquivoPDF;
ClientDataSet1.ApplyUpdates(0);
end;
i := FindNext(vSR);
end;
Na procedure CapturaArquivoPDF, coloquei o código que vai armazernar em memória o arquivo para ser gravado no banco (essa eu usei como base uma solução postada neste fórum):
procedure TForm1.CapturaArquivoPDF;
begin
vStream := TMemoryStream.Create;
vStream.LoadFromFile(vOrigem);
try
vStream.Seek(0, soFromBeginning);
ClientDataSet1EX_UROD_PDF.Assign(vStream);
// Está dando um erro nesta linha de incompatibilidade entre TPersistent e TMemorySream
finally
FreeAndNil(vStream);
end;
end;
Gostaria de uma orientação e se possível uma sugestão para que eu possa ter uma solução mais adequada.
Abraços,
Rogério
Talvez pensem que eu tive preguiça de pesquisar ao lerem o título do tópico, mas muita calma nessa hora rsrsrsrs. Estou desenvolvendo uma pequena ferramenta cujo objetivo é copiar arquivos que estão num determinado diretório, que foram gerados de outro sistema, para uma outra pasta, e salvá-los no banco. Esse processo será feito automaticamente, haverá um timer onde a cada 5 min verificará se há arquivos na pasta e executará a rotina. Dei uma pesquisa e encontrei uma solução postada por um amigo daqui, e a implementei na mina rotina. Vejam abaixo
// Código
...
private
vSR: TSearchRec;
vStream: TMemoryStream;
vOrigem, vDestino: string;
...
procedure TForm1.ExecutaOperacao;
var
i: integer;
begin
if not ValidaOperacao then
exit;
i := FindFirst(´C:\Rogério\testes\Gravar Arquivos no Banco\Origem\*.pdf´, faAnyFile, vSR);
while I = 0 do
begin
if (vSR.Attr and faDirectory) <> faDirectory then
begin
vOrigem := ´C:\Rogério\Testes\Gravar Arquivos no Banco\Origem\´ + vSR.Name;
vDestino := ´C:\Rogério\Testes\Gravar Arquivos no Banco\Destino\´ + vSR.Name;
MoveFile(PChar(vOrigem), PChar(vDestino));
ClientDataSet1.Append;
ClientDataSet1PACI_COD.AsString := CapturaParteNomeArq(1);
ClientDataSet1EX_UROD_DAT.AsString := CapturaParteNomeArq(2);
ClientDataSet1EX_UROD_HOR.AsString := CapturaParteNomeArq(3);
CapturaArquivoPDF;
ClientDataSet1.ApplyUpdates(0);
end;
i := FindNext(vSR);
end;
Na procedure CapturaArquivoPDF, coloquei o código que vai armazernar em memória o arquivo para ser gravado no banco (essa eu usei como base uma solução postada neste fórum):
procedure TForm1.CapturaArquivoPDF;
begin
vStream := TMemoryStream.Create;
vStream.LoadFromFile(vOrigem);
try
vStream.Seek(0, soFromBeginning);
ClientDataSet1EX_UROD_PDF.Assign(vStream);
// Está dando um erro nesta linha de incompatibilidade entre TPersistent e TMemorySream
finally
FreeAndNil(vStream);
end;
end;
Gostaria de uma orientação e se possível uma sugestão para que eu possa ter uma solução mais adequada.
Abraços,
Rogério
Roger1976
Curtidas 0
Respostas
Vitor Alcantara
22/10/2008
Amigo o campo que está gravando é do tipo Blob?
Se for por que você não utiliza
Field.LoadFromFile(´nome do arquivo´);
ou seja
ClientDataSet1EX_UROD_PDF.LoadFromFile(´Nome do arquivo´);
Ps: Não testei
Se for por que você não utiliza
Field.LoadFromFile(´nome do arquivo´);
ou seja
ClientDataSet1EX_UROD_PDF.LoadFromFile(´Nome do arquivo´);
Ps: Não testei
GOSTEI 0
Roger1976
22/10/2008
Amigo Vitor, obrigado pela atenção, acho que agora encontrei uma solução, e deixo abaixo o código completo, pois como sabe, mais pessoas podem ter a mesma dúvida. Ah, eu cometi um equívoco grotesco, esqueci de informar o banco e a versão do delphi. Estou usando delphi 2005 - dbxpress - sql server 2000
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DBXpress, FMTBcd, DB, DBClient, Provider,
SqlExpr, Grids, DBGrids, ShellAPI;
type
TForm1 = class(TForm)
SQLDataSet1: TSQLDataSet;
DataSetProvider1: TDataSetProvider;
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
Timer1: TTimer;
SQLConnection1: TSQLConnection;
DBGrid1: TDBGrid;
Button1: TButton;
ClientDataSet1EX_UROD_COD: TIntegerField;
ClientDataSet1PACI_COD: TStringField;
ClientDataSet1EX_UROD_DAT: TSQLTimeStampField;
ClientDataSet1EX_UROD_HOR: TSQLTimeStampField;
ClientDataSet1EX_UROD_PDF: TBlobField;
SQLDataSet1EX_UROD_COD: TIntegerField;
SQLDataSet1PACI_COD: TStringField;
SQLDataSet1EX_UROD_DAT: TSQLTimeStampField;
SQLDataSet1EX_UROD_HOR: TSQLTimeStampField;
SQLDataSet1EX_UROD_PDF: TBlobField;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
vSR: TSearchRec;
vStream: TMemoryStream;
vOrigem, vDestino: string;
procedure ExecutaOperacao;
procedure CapturaArquivoPDF;
function ValidaOperacao: boolean;
function CapturaParteNomeArq(vParte: byte) : string;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ExecutaOperacao;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// ExecutaOperacao;
// Implementar depois
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ClientDataSet1.Open;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ClientDataSet1.Close;
end;
function TForm1.ValidaOperacao: boolean;
var
vCaminhoOrigem, vCaminhoDestino: string;
begin
vCaminhoOrigem := ´C:\Rogério\Testes\Gravar Arquivos no Banco\Origem\´;
vCaminhoDestino := ´C:\Rogério\Testes\Gravar Arquivos no Banco\Destino\´;
if not DirectoryExists(vCaminhoOrigem) then
begin
showmessage(´´Caminho ´ + vCaminhoOrigem + ´ não encontrado´´ + #13 + ´Verifique´);
Timer1.Enabled := false;
exit;
end;
if not DirectoryExists(vCaminhoDestino) then
begin
showmessage(´´Caminho ´ + vCaminhoDestino + ´ não encontrado´´ + #13 + ´Verifique´);
Timer1.Enabled := false;
exit;
end;
end;
procedure TForm1.ExecutaOperacao;
var
i: integer;
begin
if not ValidaOperacao then
exit;
i := FindFirst(´C:\Rogério\testes\Gravar Arquivos no Banco\Origem\*.pdf´, faAnyFile, vSR);
while I = 0 do
begin
with ClientDataSet1 do
begin
if (vSR.Attr and faDirectory) <> faDirectory then
begin
vOrigem := ´C:\Rogério\Testes\Gravar Arquivos no Banco\Origem\´ + vSR.Name;
vDestino := ´C:\Rogério\Testes\Gravar Arquivos no Banco\Destino\´ + vSR.Name;
Append;
FieldByName(´PACI_COD´).AsString := CapturaParteNomeArq(1);
FieldByName(´EX_UROD_DAT´).AsDateTime := StrToDate(CapturaParteNomeArq(2));
FieldByName(´EX_UROD_HOR´).AsDateTime := strtotime(CapturaParteNomeArq(3));
CapturaArquivoPDF;
MoveFile(PChar(vOrigem), PChar(vDestino));
ApplyUpdates(0);
end;
end;
i := FindNext(vSR);
end;
end;
function TForm1.CapturaParteNomeArq(vParte: byte): string;
var
vTemp: string;
vPos: byte;
begin
// Captura o número da posição em que se encontra o ífem
vPos := Pos(´-´, vSR.Name);
case vParte of
1: result := copy(vSR.Name, 1, vPos - 1);
2:
begin
vTemp := copy(vSR.Name, vPos + 4, 8);
result := copy(vTemp, 1, 2) + ´/´ + copy(vTemp, 3, 2) + ´/´ + copy(vTemp, 5, 4);
end;
3:
begin
vTemp := copy(vSR.Name, vPos + 12, 4);
result := copy(vTemp, 1, 2) + ´:´ + copy(vTemp, 3, 2);
end;
end;
end;
procedure TForm1.CapturaArquivoPDF;
begin
vStream := TMemoryStream.Create;
vStream.LoadFromFile(vOrigem);
try
TBlobField(ClientDataSet1EX_UROD_PDF).LoadFromFile(vOrigem);
if ClientDataSet1.ApplyUpdates(0) > 0 then
showmessage(´Erro ao gravar o arquivo´);
finally
FreeAndNil(vStream);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TBlobField(ClientDataSet1EX_UROD_PDF).SaveToFile(´.\Temp\´ + ClientDataSet1PACI_COD.AsString + ´.pdf´);
ShellExecute(Application.Handle,nil, pchar(´.\Temp\´ + ClientDataSet1PACI_COD.AsString + ´.pdf´)
, nil, nil,sw_ShowNormal);
end;
end.
Explicação da rotina:
Há um software que gera dados do exame do paciente em pdf para uma pasta do micro. A função da rotina acima é verificar a cada 1 min se há arquivos nesta pasta. Se houver, analisará um a um, extrairá o nome do arquivo, cada parte deste será gravada num campo da tabela, e por final salvará o arquivo pdf. Este aplicativo trabalhará como um robô, essa será sua função.
Amigo Vitor e demais deste fórum, por favor fiquem a vontade para mais sugestões, o importante é compartilhar o conhecimento, se estiver errado, por favor me corrijam.
É isso.
Abraços,
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DBXpress, FMTBcd, DB, DBClient, Provider,
SqlExpr, Grids, DBGrids, ShellAPI;
type
TForm1 = class(TForm)
SQLDataSet1: TSQLDataSet;
DataSetProvider1: TDataSetProvider;
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
Timer1: TTimer;
SQLConnection1: TSQLConnection;
DBGrid1: TDBGrid;
Button1: TButton;
ClientDataSet1EX_UROD_COD: TIntegerField;
ClientDataSet1PACI_COD: TStringField;
ClientDataSet1EX_UROD_DAT: TSQLTimeStampField;
ClientDataSet1EX_UROD_HOR: TSQLTimeStampField;
ClientDataSet1EX_UROD_PDF: TBlobField;
SQLDataSet1EX_UROD_COD: TIntegerField;
SQLDataSet1PACI_COD: TStringField;
SQLDataSet1EX_UROD_DAT: TSQLTimeStampField;
SQLDataSet1EX_UROD_HOR: TSQLTimeStampField;
SQLDataSet1EX_UROD_PDF: TBlobField;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
vSR: TSearchRec;
vStream: TMemoryStream;
vOrigem, vDestino: string;
procedure ExecutaOperacao;
procedure CapturaArquivoPDF;
function ValidaOperacao: boolean;
function CapturaParteNomeArq(vParte: byte) : string;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ExecutaOperacao;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// ExecutaOperacao;
// Implementar depois
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ClientDataSet1.Open;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ClientDataSet1.Close;
end;
function TForm1.ValidaOperacao: boolean;
var
vCaminhoOrigem, vCaminhoDestino: string;
begin
vCaminhoOrigem := ´C:\Rogério\Testes\Gravar Arquivos no Banco\Origem\´;
vCaminhoDestino := ´C:\Rogério\Testes\Gravar Arquivos no Banco\Destino\´;
if not DirectoryExists(vCaminhoOrigem) then
begin
showmessage(´´Caminho ´ + vCaminhoOrigem + ´ não encontrado´´ + #13 + ´Verifique´);
Timer1.Enabled := false;
exit;
end;
if not DirectoryExists(vCaminhoDestino) then
begin
showmessage(´´Caminho ´ + vCaminhoDestino + ´ não encontrado´´ + #13 + ´Verifique´);
Timer1.Enabled := false;
exit;
end;
end;
procedure TForm1.ExecutaOperacao;
var
i: integer;
begin
if not ValidaOperacao then
exit;
i := FindFirst(´C:\Rogério\testes\Gravar Arquivos no Banco\Origem\*.pdf´, faAnyFile, vSR);
while I = 0 do
begin
with ClientDataSet1 do
begin
if (vSR.Attr and faDirectory) <> faDirectory then
begin
vOrigem := ´C:\Rogério\Testes\Gravar Arquivos no Banco\Origem\´ + vSR.Name;
vDestino := ´C:\Rogério\Testes\Gravar Arquivos no Banco\Destino\´ + vSR.Name;
Append;
FieldByName(´PACI_COD´).AsString := CapturaParteNomeArq(1);
FieldByName(´EX_UROD_DAT´).AsDateTime := StrToDate(CapturaParteNomeArq(2));
FieldByName(´EX_UROD_HOR´).AsDateTime := strtotime(CapturaParteNomeArq(3));
CapturaArquivoPDF;
MoveFile(PChar(vOrigem), PChar(vDestino));
ApplyUpdates(0);
end;
end;
i := FindNext(vSR);
end;
end;
function TForm1.CapturaParteNomeArq(vParte: byte): string;
var
vTemp: string;
vPos: byte;
begin
// Captura o número da posição em que se encontra o ífem
vPos := Pos(´-´, vSR.Name);
case vParte of
1: result := copy(vSR.Name, 1, vPos - 1);
2:
begin
vTemp := copy(vSR.Name, vPos + 4, 8);
result := copy(vTemp, 1, 2) + ´/´ + copy(vTemp, 3, 2) + ´/´ + copy(vTemp, 5, 4);
end;
3:
begin
vTemp := copy(vSR.Name, vPos + 12, 4);
result := copy(vTemp, 1, 2) + ´:´ + copy(vTemp, 3, 2);
end;
end;
end;
procedure TForm1.CapturaArquivoPDF;
begin
vStream := TMemoryStream.Create;
vStream.LoadFromFile(vOrigem);
try
TBlobField(ClientDataSet1EX_UROD_PDF).LoadFromFile(vOrigem);
if ClientDataSet1.ApplyUpdates(0) > 0 then
showmessage(´Erro ao gravar o arquivo´);
finally
FreeAndNil(vStream);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TBlobField(ClientDataSet1EX_UROD_PDF).SaveToFile(´.\Temp\´ + ClientDataSet1PACI_COD.AsString + ´.pdf´);
ShellExecute(Application.Handle,nil, pchar(´.\Temp\´ + ClientDataSet1PACI_COD.AsString + ´.pdf´)
, nil, nil,sw_ShowNormal);
end;
end.
Explicação da rotina:
Há um software que gera dados do exame do paciente em pdf para uma pasta do micro. A função da rotina acima é verificar a cada 1 min se há arquivos nesta pasta. Se houver, analisará um a um, extrairá o nome do arquivo, cada parte deste será gravada num campo da tabela, e por final salvará o arquivo pdf. Este aplicativo trabalhará como um robô, essa será sua função.
Amigo Vitor e demais deste fórum, por favor fiquem a vontade para mais sugestões, o importante é compartilhar o conhecimento, se estiver errado, por favor me corrijam.
É isso.
Abraços,
GOSTEI 0
Vitor Alcantara
22/10/2008
Amigo só complementando, acho que não existe mais a necessidade da variável vStream.
GOSTEI 0
Roger1976
22/10/2008
Amigo Vitor, como vai?
Fiz um teste e funcionou. Eu tenho dúvida, a gente vê milhares de exemplos como este, utilizando variáveis stream, como estou há pouco tempo trabalhando como programador, gostaria de entender o por quê, visto que uma linha apenas resolveu o problema.
Abraços,
Fiz um teste e funcionou. Eu tenho dúvida, a gente vê milhares de exemplos como este, utilizando variáveis stream, como estou há pouco tempo trabalhando como programador, gostaria de entender o por quê, visto que uma linha apenas resolveu o problema.
Abraços,
GOSTEI 0
Tiagosaprogramador
22/10/2008
Ola roger1976
Vc tem um programa que gera o arquivo em pdf e salva automaticamente?
Eu preciso de algo assim estou tentando gerar e salva-lo via programacao e uma pasta pre definida, mas ainda nao consegui.
Se puder me ajudar, agradeco desde ja
abraco e att
Vc tem um programa que gera o arquivo em pdf e salva automaticamente?
Eu preciso de algo assim estou tentando gerar e salva-lo via programacao e uma pasta pre definida, mas ainda nao consegui.
Se puder me ajudar, agradeco desde ja
abraco e att
GOSTEI 0
Vitor Alcantara
22/10/2008
Roger 1976 na medida do possível vou bem.
Roger 1976, da uma olhada nesse tópico que achei na internet.
[url]http://www.ramosdainformatica.com.br/art_recentes01.php?CDA=466[/url]
Roger 1976, da uma olhada nesse tópico que achei na internet.
[url]http://www.ramosdainformatica.com.br/art_recentes01.php?CDA=466[/url]
GOSTEI 0
Roger1976
22/10/2008
Amigo Vitor, pra que gastar 10 linhas de código se uma faz a mesma coisa, não é?
Seguindo sua sugestão, utilizei apenas esta linha:
....
dm.cdsUIDExUrodinEX_UROD_PDF.LoadFromFile(vOrigem);
dm.cdsUIDExUrodin.ApplyUpdates(0);
....
Funcionou da mesma forma qdo trabalho com stream. Fiz vários testes e até agora está ok.
Amigo Tiago, eu dei uma pesquisada na net, achei um exemplo e o Vitor me deu uma força, dê uma olhada nesta procedure que eu criei, basicamente faz um loop, em cada arquivo extrai partes do nome, onde cada uma é gravada num campo, e depois sim é gravado o arquivo pdf no banco (sql server 2000). Veja abaixo;
Extrai o arquivo em partes:
Nome do arquivo exemplo (nomenclatura padrão de todos os arquivos pdf que são gerados em outro sistema):
1254755H-FLX301020080923
function TfrmPrincipal.CapturaParteNomeArq(vParte: byte): string;
var
vTemp: string;
vPos: byte;
begin
// Captura o número da posição em que se encontra o ífem
vPos := Pos(´-´, vSR.Name);
case vParte of
1: result := copy(vSR.Name, 1, vPos - 1); => extrai o código do paciente
2:
begin
vTemp := copy(vSR.Name, vPos + 4, 8);
result := copy(vTemp, 1, 2) + ´/´ + copy(vTemp, 3, 2) + ´/´ + copy(vTemp, 5, 4); => extrai a data
end;
3:
begin
vTemp := copy(vSR.Name, vPos + 12, 4);
result := copy(vTemp, 1, 2) + ´:´ + copy(vTemp, 3, 2); => extrai a hora
end;
end;
end;
Procedure que grava o arquivo (acho que é a parte que vc quer):
procedure TfrmPrincipal.GravaRegistro;
var
i: integer;
begin
vOrigem := ´´;
vDestino := ´´;
if not ValidaOperacao then
exit;
i := FindFirst(dm.vOrigem + ´\*.pdf´, faAnyFile, vSR);
while I = 0 do
begin
with dm.cdsUIDExUrodin do
begin
if (vSR.Attr and faDirectory) <> faDirectory then
begin
vOrigem := dm.vOrigem + ´\´ + vSR.Name;
vDestino := dm.vDestino + ´\´ + vSR.Name;
Append;
//FieldByName(´EX_UROD_COD´).AsInteger := 0;
FieldByName(´PACI_COD´).AsString := CapturaParteNomeArq(1);
FieldByName(´EX_UROD_DAT´).AsDateTime := StrToDate(CapturaParteNomeArq(2));
FieldByName(´EX_UROD_HOR´).AsDateTime := strtotime(CapturaParteNomeArq(3));
dm.cdsUIDExUrodinEX_UROD_PDF.LoadFromFile(vOrigem);
MoveFile(PChar(vOrigem), PChar(vDestino));
ApplyUpdates(0);
end;
end;
i := FindNext(vSR);
end;
end;
As variáveis vOrigem e vDestino (string) e vSR (TSearchRec) são declaradas na seção private desta unit. Já as dm.vOrigem e dm.vDestino foram declaradas no datamodule. Eu pensei que era um bicho de sete cabeças, mas não.
Espero tê-lo ajudado.
Vitor, vou ler o artigo com mais calma, obrigado kra.
Abraços,
Seguindo sua sugestão, utilizei apenas esta linha:
....
dm.cdsUIDExUrodinEX_UROD_PDF.LoadFromFile(vOrigem);
dm.cdsUIDExUrodin.ApplyUpdates(0);
....
Funcionou da mesma forma qdo trabalho com stream. Fiz vários testes e até agora está ok.
Amigo Tiago, eu dei uma pesquisada na net, achei um exemplo e o Vitor me deu uma força, dê uma olhada nesta procedure que eu criei, basicamente faz um loop, em cada arquivo extrai partes do nome, onde cada uma é gravada num campo, e depois sim é gravado o arquivo pdf no banco (sql server 2000). Veja abaixo;
Extrai o arquivo em partes:
Nome do arquivo exemplo (nomenclatura padrão de todos os arquivos pdf que são gerados em outro sistema):
1254755H-FLX301020080923
function TfrmPrincipal.CapturaParteNomeArq(vParte: byte): string;
var
vTemp: string;
vPos: byte;
begin
// Captura o número da posição em que se encontra o ífem
vPos := Pos(´-´, vSR.Name);
case vParte of
1: result := copy(vSR.Name, 1, vPos - 1); => extrai o código do paciente
2:
begin
vTemp := copy(vSR.Name, vPos + 4, 8);
result := copy(vTemp, 1, 2) + ´/´ + copy(vTemp, 3, 2) + ´/´ + copy(vTemp, 5, 4); => extrai a data
end;
3:
begin
vTemp := copy(vSR.Name, vPos + 12, 4);
result := copy(vTemp, 1, 2) + ´:´ + copy(vTemp, 3, 2); => extrai a hora
end;
end;
end;
Procedure que grava o arquivo (acho que é a parte que vc quer):
procedure TfrmPrincipal.GravaRegistro;
var
i: integer;
begin
vOrigem := ´´;
vDestino := ´´;
if not ValidaOperacao then
exit;
i := FindFirst(dm.vOrigem + ´\*.pdf´, faAnyFile, vSR);
while I = 0 do
begin
with dm.cdsUIDExUrodin do
begin
if (vSR.Attr and faDirectory) <> faDirectory then
begin
vOrigem := dm.vOrigem + ´\´ + vSR.Name;
vDestino := dm.vDestino + ´\´ + vSR.Name;
Append;
//FieldByName(´EX_UROD_COD´).AsInteger := 0;
FieldByName(´PACI_COD´).AsString := CapturaParteNomeArq(1);
FieldByName(´EX_UROD_DAT´).AsDateTime := StrToDate(CapturaParteNomeArq(2));
FieldByName(´EX_UROD_HOR´).AsDateTime := strtotime(CapturaParteNomeArq(3));
dm.cdsUIDExUrodinEX_UROD_PDF.LoadFromFile(vOrigem);
MoveFile(PChar(vOrigem), PChar(vDestino));
ApplyUpdates(0);
end;
end;
i := FindNext(vSR);
end;
end;
As variáveis vOrigem e vDestino (string) e vSR (TSearchRec) são declaradas na seção private desta unit. Já as dm.vOrigem e dm.vDestino foram declaradas no datamodule. Eu pensei que era um bicho de sete cabeças, mas não.
Espero tê-lo ajudado.
Vitor, vou ler o artigo com mais calma, obrigado kra.
Abraços,
GOSTEI 0