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á!