Conforme comentado na parte anterior do artigo, vamos criar um procedimento para atender ao bloco VII do roteiro de homologações PAF-ECF, em sua versão 1.5 de abril de 2011, aplicável à versão 01.07, onde regulamenta os “Dados Técnicos para Geração da Assinatura Digital EAD”. Anexo VIII do Ato Cotepe 06/08.
Sem mais delongas vamos primeiramente ver a função que será responsável pela geração do código MD5, do registro da tabela do banco de dados. Segue abaixo:
function Gerar_MD5_Registro_Tabela_Dados(Tabela:TDataSet):String;
var i : Integer;
AuxSTR, NomeCampo, TipoCampo : String;
begin
// efetua um loop nos registros da tabela somando uma variávei string
// para gerar o MF5
AuxSTR := '';
for i:=0 to DataSet.Fields.Count - 1 do
begin
NomeCampo := UpperCase(DataSet.Fields.Fields[i].FieldName);
TipoCampo := FieldTypeNames[DataSet.Fields.Fields[i].DataType];
if NomeCampo <> 'CAMPO_MD5_REGISTRO' then
begin
if TipoCampo = 'String' then
AuxSTR := AuxSTR + DataSet.FieldByName(NomeCampo).AsString;
if TipoCampo = 'WideString' then
AuxSTR := AuxSTR + DataSet.FieldByName(NomeCampo).AsString;
if TipoCampo = 'ftMemo' then
AuxSTR := AuxSTR + DataSet.FieldByName(NomeCampo).AsString;
if TipoCampo = 'Integer' then
AuxSTR := AuxSTR + IntToStr(DataSet.FieldByName(NomeCampo).AsInteger);
if TipoCampo = 'Smallint' then
AuxSTR := AuxSTR + IntToStr(DataSet.FieldByName(NomeCampo).AsInteger);
if TipoCampo = 'Largeint' then
AuxSTR := AuxSTR + IntToStr(DataSet.FieldByName(NomeCampo).AsInteger);
if TipoCampo = 'Word' then
AuxSTR := AuxSTR + IntToStr(DataSet.FieldByName(NomeCampo).AsInteger);
if TipoCampo = 'Float' then
AuxSTR := AuxSTR + FloatToStr(DataSet.FieldByName(NomeCampo).AsFloat);
if TipoCampo = 'Currency' then
AuxSTR := AuxSTR + FloatToStr(DataSet.FieldByName(NomeCampo).AsFloat);
if TipoCampo = 'FMTBcd' then
AuxSTR := AuxSTR + FloatToStr(DataSet.FieldByName(NomeCampo).AsFloat);
if TipoCampo = 'Date' then
AuxSTR := AuxSTR + DateToStr(DataSet.FieldByName(NomeCampo).AsDateTime);
if TipoCampo = 'DateTime' then
AuxSTR := AuxSTR + DateToStr(DataSet.FieldByName(NomeCampo).AsDateTime);
if TipoCampo = 'Time' then
AuxSTR := AuxSTR + DateToStr(DataSet.FieldByName(NomeCampo).AsDateTime);
end;
end;
// retorna o resultado
Result := MD5Print(MD5String(AuxSTR));
end;
É importante ressaltar, que onde se refere no código “CAMPO_MD5_REGISTRO”, indica que deverá ser criado um campo na tabela onde se irá realizar o controle de alteração dos dados, para armazenar o código MD5 gerado pela função apresentada acima.
Observe que nestes códigos, este campo criado na tabela não fará parte da composição do código MD5 (if NomeCampo <> 'CAMPO_MD5_REGISTRO' then), pois o mesmo será gravado neste registro, após a geração, e iria fazer com que sempre houvesse divergência no momento de verificar as possível alterações.
De posse deste código, basta programar na sua aplicação e chama-lo para gerar o MD5 após a conclusão do preenchimento dos campos do registro. Em geral no evento BeforePost do ClientDataSet, e gravar o resultado no campo criado para armazena-lo.
Na próxima parte do artigo, vou comentar sobre a parte de comparação do código MD5.
Até lá!